Android 동적 가우스 퍼 지 효과 예제 코드 구현

8461 단어 android동적 모호
앞 에 쓰다
현재 점점 더 많은 앱 에서 모호 효 과 를 사 용 했 는데 이런 모호 효 과 를 고 스 모호 라 고 부른다.안 드 로 이 드 플랫폼 에서 퍼 지 렌 더 링 을 하 는 것 은 CPU 도 상당히 소모 되 고 시간 도 많이 걸 리 는 작업 으로 처리 가 잘 되 지 않 으 면 카드 가 걸 리 는 것 이 불가피 하 다 는 것 을 잘 알 고 있 습 니 다.일반적으로 효율 을 고려 하여 한 장의 그림 을 과장 하 는 가장 좋 은 방법 은 OpenGL 을 사용 하 는 것 이 고,그 다음은 C++/C 를 사용 하 는 것 이 며,자바 코드 를 사용 하 는 것 이 효율 이 가장 낮 고 속도 도 가장 느리다.그러나 Android 가 RenderScript 를 출시 한 후에 우 리 는 선택 을 했 습 니 다.테스트 에 따 르 면 RederScript 를 사용 하 는 렌 더 링 효율 은 C++C 를 사용 하 는 것 과 막상막하 이지 만 RenderScript 를 사용 하 는 것 은 JNI 를 사용 하 는 것 보다 훨씬 간단 합 니 다!또한,Android 팀 은 낮은 버 전의 Android 플랫폼 에서 도 사용 할 수 있 도록 RenderScript 지원 라 이브 러 리 를 제공 합 니 다.
그러나 RenderScript 를 사용 하기 전에 모호 한 그림 에 대해 주의해 야 할 것 은 원래 사이즈 해상도 의 그림 을 사용 하지 말고 그림 의 비율 을 줄 이 는 것 이 좋 습 니 다.이 작은 렌 더 링 의 효율 이 높 고 속도 도 빠 릅 니 다.
렌 더 스 크 립 트 가 뭐야?
RenderScript 는 저급한 고성능 프로 그래 밍 언어 로 3D 렌 더 링 과 처리 밀집 형 컴 퓨 팅(3D 재생 등 과 CPU 밀집 형 컴 퓨 팅)에 사용 된다.그동안 안 드 로 이 드 는 그래 픽 성능 이 좋 지 않 았 고 NDK 를 도입 한 후에 야 개선 되 었 으 며,Honey comb 에서 RenderScript 라 는 킬러 급 은 Framework 이후 안 드 로 이 드 로 컬 언어의 실행 능력 과 컴 퓨 팅 능력 을 크게 증가 시 켰 다.현재 인터넷 상에 서 RenderScript 를 소개 하 는 글 은 매우 적 고 블 로 그 를 한 편 동봉 하면 여러분 들 은 이 언어 를 더욱 잘 이해 할 수 있 습 니 다.
자세히 알 고 싶 으 면 공식 문 서 를 볼 수 있 습 니 다RenderScript
동적 모호 한 실현
사용 하기 전에 Module build.gradle 에서 다음 정 의 를 내 려 야 합 니 다.

MainActivity.java

package com.jackie.blurimage; 
 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.widget.ImageView; 
import android.widget.SeekBar; 
import android.widget.TextView; 
 
public class MainActivity extends AppCompatActivity { 
  private ImageView mBlurImage, mOriginImage; 
  private SeekBar mSeekBar; 
  private TextView mSeekProgress; 
 
  private int mAlpha; 
 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
 
    initView(); 
    initData(); 
    initEvent(); 
  } 
 
  private void initView() { 
    mBlurImage = (ImageView) findViewById(R.id.blur_image); 
    mOriginImage = (ImageView) findViewById(R.id.origin_image); 
    mSeekBar = (SeekBar) findViewById(R.id.seek_bar); 
    mSeekProgress = (TextView) findViewById(R.id.seek_progress); 
  } 
 
  private void initData() { 
    //      
    Bitmap originBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.blur); 
    Bitmap blurBitmap = BlurUtils.blur(this, originBitmap); 
 
    //             
    mBlurImage.setImageBitmap(blurBitmap); 
    mOriginImage.setImageBitmap(originBitmap); 
  } 
 
  private void initEvent() { 
    mSeekBar.setMax(100); 
 
    mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
        mAlpha = progress; 
 
        mOriginImage.setAlpha((int) (255 - mAlpha * 2.55)); 
        mSeekProgress.setText(String.valueOf(mAlpha)); 
      } 
 
      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 
 
      } 
 
      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 
 
      } 
    }); 
  } 
} 
activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
  xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" 
  android:orientation="vertical"> 
 
  <FrameLayout 
    android:layout_width="match_parent" 
    android:layout_weight="1" 
    android:layout_height="0dp"> 
 
    <ImageView 
      android:id="@+id/blur_image" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:scaleType="centerCrop" 
      android:src="@drawable/blur"/> 
 
    <ImageView 
      android:id="@+id/origin_image" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:scaleType="centerCrop"/> 
  </FrameLayout> 
 
  <LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="80dp" 
    android:orientation="vertical"> 
 
    <SeekBar 
      android:id="@+id/seek_bar" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="16dp" 
      android:layout_marginRight="16dp" 
      android:layout_marginTop="@dimen/activity_vertical_margin"/> 
 
    <TextView 
      android:id="@+id/seek_progress" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:text="0" 
      android:textSize="24sp"/> 
  </LinearLayout> 
</LinearLayout> 
위의 코드 를 통 해 알 수 있 듯 이 FrameLayout 에 두 장의 그림 을 올 린 다음 에 그림 의 투명 도 를 동적 으로 바 꾸 어 동적 모호 효 과 를 얻 었 다.
BlurUtils.java

package com.jackie.blurimage; 
 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.renderscript.Allocation; 
import android.renderscript.Element; 
import android.renderscript.RenderScript; 
import android.renderscript.ScriptIntrinsicBlur; 
 
/** 
 * Created by Jackie on 2017/1/21. 
 *         
 */ 
 
public class BlurUtils { 
  /** 
   *        
   */ 
  private static final float SCALE_DEGREE = 0.4f; 
  /** 
   *      ( 0.0 25.0  ) 
   */ 
  private static final float BLUR_RADIUS = 25f; 
 
  /** 
   *      
   * @param context      
   * @param bitmap          
   * @return              
   */ 
  public static Bitmap blur(Context context,Bitmap bitmap) { 
    //          
    int width = Math.round(bitmap.getWidth() * SCALE_DEGREE); 
    int height = Math.round(bitmap.getHeight() * SCALE_DEGREE); 
 
    //                
    Bitmap inputBitmap = Bitmap.createScaledBitmap(bitmap, width, height, false); 
    //             
    Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap); 
 
    //  RenderScript     
    RenderScript renderScript = RenderScript.create(context); 
    //         RenderScript      
    ScriptIntrinsicBlur scriptIntrinsicBlur = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript)); 
 
    /** 
     *   RenderScript     VM     ,      Allocation           。 
     *   Allocation            ,    copyTo()       。 
     */ 
    Allocation inputAllocation = Allocation.createFromBitmap(renderScript, inputBitmap); 
    Allocation outputAllocation = Allocation.createFromBitmap(renderScript, outputBitmap); 
 
    //         ,25f       
    scriptIntrinsicBlur.setRadius(BLUR_RADIUS); 
    //  ScriptIntrinsicBlur        
    scriptIntrinsicBlur.setInput(inputAllocation); 
    // ScriptIntrinsicBlur             
    scriptIntrinsicBlur.forEach(outputAllocation); 
 
    //      Allocation  
    outputAllocation.copyTo(outputBitmap); 
 
    return outputBitmap; 
  } 
} 
효과 도 는 다음 과 같 습 니 다.여동생 종이 하나!

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기