Android 는 RenderScript 를 이용 하여 모 유리 퍼 지 효과 예제 를 실현 합 니 다.

RenderScript 소개
시작 하기 전에 렌 더 스 크 립 트 의공식 소개:
RenderScript is a framework for running computationally intensive tasks at high performance on Android. RenderScript is primarily oriented for use with data-parallel computation, although serial workloads can benefit as well. The RenderScript runtime parallelizes work across processors available on a device, such as multi-core CPUs and GPUs. This allows you to focus on expressing algorithms rather than scheduling work. RenderScript is especially useful for applications performing image processing, computational photography, or computer vision.
대체로 렌 더 스 크 립 트 는 안 드 로 이 드 플랫폼 에서 밀집 형 작업 을 계산 하기 위 한 고성능 프레임 워 크 이 며 렌 더 스 크 립 트 는 특히 이미지 처리 에 유용 하 다 는 뜻 이다.또 렌 더 스 크 립 트 가 효율 적 인 이 유 는 밑바닥 이 C 로 이 뤄 졌 기 때문이다.
RenderScript 지원 라 이브 러 리 사용 하기
더 빠 른 버 전 으로 호 환 되 기 위해 서 는 android.renderscript(API level 11+지원)대신android.support.v8.renderscript가방 을 직접 사용 합 니 다.
Android Studio 의 경우 app 의 build.gradle 파일 을 열 고 android 의 defaultConfig 노드 에 두 마디 를 추가 합 니 다.

renderscriptTargetApi 18
renderscriptSupportModeEnabled true
그 중에서 renderscriptTargetApi 의 값 은 공식 적 으로 11 부터 최신 API Level 까지 가능 합 니 다.
이렇게 하면 우 리 는 가이드 백 을 기다 리 면 v8 내 를 안내 할 수 있다.
모호 한 배경
국부 모호
먼저 우리 가 실현 해 야 할 효과 도:

여기 서 볼 수 있 는 것 은 부분 적 인 모호 이 고 그림 의 한가운데 에 TextView 가 있 으 며 TextView 의 배경 부분 은 모호 하 게 처리 되 었 다.
먼저 모호 한 주요 절 차 를 대체적으로 말 하 다.
  • 먼저 TextView 가 ImageView 바로 위 에 있 는 배경 을 꺼 냅 니 다
  • 그리고 꺼 낸 배경 을 모호 하 게 처리 합 니 다
  • 마지막 으로 흐릿 하 게 처 리 된 배경 을 TextView 배경 으로 설정 합 니 다.
  • 이렇게 하면 우리 그림 의 부분 적 인 모호 효 과 를 얻 을 수 있 고 구체 적 인 과정 은 코드 에 상세 한 주석 이 있다.
    다음 에 먼저 레이아웃 파일 을 붙 입 니 다:
    
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:padding="20dp">
    
     <FrameLayout
      android:layout_width="300dp"
      android:layout_height="300dp"
      android:layout_centerInParent="true">
    
      <ImageView
       android:id="@+id/image"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:scaleType="centerCrop"
       android:src="@drawable/img"/>
    
      <TextView
       android:id="@+id/text"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="center"
       android:text="Melody"
       android:textColor="@android:color/white"
       android:textSize="45sp"/>
    
     </FrameLayout>
    
    </RelativeLayout>
    자바 코드 추가:
    
    public class MainActivity extends Activity implements Runnable {
    
     private static final String TAG = "MainActivity";
    
     private ImageView mImage;
     private TextView mText;
    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      mImage = (ImageView) findViewById(R.id.image);
      mText = (TextView) findViewById(R.id.text);
      // onCreate()    ImageView   ,     post           
      mImage.post(this);
     }
    
     @Override
     public void run() {
      blur(getImageViewBitmap(mImage), mText);
     }
    
     /**
      *     imageView bitmap  
      */
     public Bitmap getImageViewBitmap(ImageView imageView) {
      imageView.setDrawingCacheEnabled(true);
      //   ImageView Bitmap
      Bitmap bitmap = imageView.getDrawingCache();
      //     bitmap    
      Bitmap bitmapCopy = bitmap.copy(bitmap.getConfig(), true);
      imageView.setDrawingCacheEnabled(false);
      return bitmapCopy;
     }
    
     /**
      *        
      *
      * @param inputBitmap      bitmap
      * @param targetView          View
      */
     public void blur(Bitmap inputBitmap, View targetView) {
      //        View(        View)        outputBitmap
      Bitmap outputBitmap = Bitmap.createBitmap((int) (targetView.getMeasuredWidth()),
        (int) (targetView.getMeasuredHeight()), Bitmap.Config.ARGB_8888);
      //   outputBitmap     canvas  
      Canvas canvas = new Canvas(outputBitmap);
      //         View         
      canvas.translate(-targetView.getLeft(), -targetView.getTop());
      Paint paint = new Paint();
      paint.setFlags(Paint.FILTER_BITMAP_FLAG);
      //       inputBitmap     outputBitmap  
      //        translate   ,           View              outputBitmap  
      canvas.drawBitmap(inputBitmap, 0, 0, paint);
    
      // ----       outputBitmap     ----
    
      //    RenderScript
      RenderScript rs = RenderScript.create(this);
      Allocation input = Allocation.createFromBitmap(rs, outputBitmap);
      Allocation output = Allocation.createTyped(rs, input.getType());
      //    ScriptIntrinsicBlur       
      ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(
        rs, Element.U8_4(rs));
      //        (      ( 0.0f , 25f ] ,    ,       )
      blur.setRadius(25f);
      blur.setInput(input);
      //     
      blur.forEach(output);
      //    outputBitmap
      output.copyTo(outputBitmap);
      //       outputBitmap      View    
      targetView.setBackground(new BitmapDrawable(getResources(), outputBitmap));
      rs.destroy();
     }
    
    }
    v8 가방 안내:
    
    import android.support.v8.renderscript.Allocation;
    import android.support.v8.renderscript.Element;
    import android.support.v8.renderscript.RenderScript;
    import android.support.v8.renderscript.ScriptIntrinsicBlur;
    완전 모호
    위 는 부분 적 으로 모호 한 다음 에 TextView 의 넓 고 높 은 부모 구 조 를 바 꾸 어 ImageView 크기 와 똑 같이 완전히 모호 한 효 과 를 실현 하도록 합 니 다.
    
    ...
    <TextView
     android:id="@+id/text"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:gravity="center"
     android:text="Melody"
     android:textColor="@android:color/white"
     android:textSize="45sp"/>
    ...
    자바 코드 부분 은 변경 할 필요 가 없습니다.다음은 효과 도 를 보 겠 습 니 다.

    효율 은 어 떻 습 니까?
    작업 시간 을 보기 위해 서 저 는 Log 를 사용 하여 blur()방법의 시작 과 끝 에 각각 시간 을 계산 한 다음 에 시간 차 를 보 았 습 니 다.
    
    10-09 17:04:23.664 23665-23665/com.melodyxxx.blurdemo2 E/MainActivity: spend: 120ms
    120 ms 가 들 었 다 는 것 을 볼 수 있 습 니 다.분명히 효율 이 높 지 않 고 최적화 하 는 방법 이 있 습 니까?(테스트 모델 은 매 족 PRO 6)
    효율 최적화
    위 에 있 는 것 은 원래 ImageView 의 bitmap 를 직접 모호 하 게 처리 하 는 것 으로 효율 이 높 지 않 기 때문에 우 리 는 먼저 원래 의 그림 을 압축 처리 한 다음 에 모호 하 게 할 수 있다.아래 는 관건 적 인 코드 이 고 scaleFactor 는 압축 비례 크기 이다.예 를 들 어 scaleFactor 는 2 이 며 원 도 를 원래 의 1/2 로 압축 한 다음 에 모호 하 게 하면 효율 이 매우 높다 는 것 을 의미한다.
    
    ...
    Bitmap outputBitmap = Bitmap.createBitmap((int) (mTargetView.getMeasuredWidth() / scaleFactor),
      (int) (mTargetView.getMeasuredHeight() / scaleFactor), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(outputBitmap);
    canvas.translate(-mTargetView.getLeft() / scaleFactor, -mTargetView.getTop() / scaleFactor);
    canvas.scale(1 / scaleFactor, 1 / scaleFactor);
    Paint paint = new Paint();
    paint.setFlags(Paint.FILTER_BITMAP_FLAG);
    canvas.drawBitmap(mInputBitmap, 0, 0, paint);
    ...
    다음은 데모 효과 그림:

    결과:
    압축 비율 2 시:19 ms 소모
    압축 비율 8 시:2ms 소모
    압축 비율 에 따라 서로 다른 모호 반경 을 배합 하면 서로 다른 모호 효 과 를 얻 을 수 있다.
    그 다음 에 Demo 효과 그림 에서 SeekBar 를 드래그 하면 모호 효 과 를 동태 적 으로 실현 할 수 있 습 니 다.먼저 생각 나 는 방법 은 드래그 할 때마다 실시 간 으로 모호 한 계산 을 하 는 것 입 니 다.이런 효율 은 안 되 고 멈 출 수 있 습 니 다.제 가 여기 있 는 방법 은 그림 을 최대한 모호 하 게 해서 위 ImageView 의 배경 에 설정 하면 됩 니 다.그리고 SeekBar 가 드래그 할 때...맨 위 나 아래 그림 의 투명 도 를 바 꾸 기만 하면 위의 효 과 를 얻 을 수 있다.
    무료 APK 다운로드:http://fir.im/snmb
    데모 주소:여 기 를 클릭 하 세 요.
    총결산
    렌 더 스 크 립 트 외 에 도 고 스 퍼 지 를 실현 할 수 있 는 다른 방법 도 있다.예 를 들 어 FastBlur 등 은 모호 할 때 원 도 를 직접 모호 하 게 처리 하지 말고 먼저 크기 를 조정 한 다음 에 모호 하 게 하면 모호 한 속 도 를 크게 높 일 수 있다.자,이상 이 이 글 의 모든 내용 입 니 다.본 논문 의 내용 이 개발 자 여러분 에 게 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 십시오.저희 에 대한 지지 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기