Android 는 RenderScript 를 이용 하여 모 유리 퍼 지 효과 예제 를 실현 합 니 다.
8965 단어 androidrenderscript털 유리 가 흐릿 하 다
시작 하기 전에 렌 더 스 크 립 트 의공식 소개:
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 의 배경 부분 은 모호 하 게 처리 되 었 다.
먼저 모호 한 주요 절 차 를 대체적으로 말 하 다.
다음 에 먼저 레이아웃 파일 을 붙 입 니 다:
<?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 등 은 모호 할 때 원 도 를 직접 모호 하 게 처리 하지 말고 먼저 크기 를 조정 한 다음 에 모호 하 게 하면 모호 한 속 도 를 크게 높 일 수 있다.자,이상 이 이 글 의 모든 내용 입 니 다.본 논문 의 내용 이 개발 자 여러분 에 게 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 십시오.저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.