안 드 로 이 드 는 가우스 퍼 지 효 과 를 실현 하고 낮은 버 전 을 호 환 합 니 다.
프로젝트 에서 고 스 퍼 지 효 과 를 사 용 했 고 자 료 를 조회 한 적 이 있 습 니 다.성능 문 제 를 고려 하여 결국은 안 드 로 이 드 가 가지 고 있 는 렌 더 스 크 립 트 라 이브 러 리 를 사용 하여 이 루어 집 니 다.렌 더 스 크 립 트 를 사용 하여 고 스 퍼 지 인터넷 을 실현 하 는 데 도 비슷 한 방법 이 많 습 니 다.대부분 복잡 하 게 정리 되 었 습 니 다.여 기 는 비슷 한 수 요 를 가 진 학생 들 이 참고 하고 공부 할 수 있 도록 정리 한 셈 입 니 다.
(프로젝트 효과 도)
프로젝트 효과 그림 의 실현 방향 을 간단하게 설명 합 니 다.
① 정 의 된 xml 를 불 러 오 는 Layout
② 현재 창의 Bitmap 대상 을 캡 처 방법 으로 가 져 오기
③ Bitmap 대상 을 압축 및 가우스 퍼 지 처리
④ 처 리 된 퍼 지 그림 대상 을 ① 에 불 러 온 Layout 의 Background 로 한다.
⑤ 퍼 지 그림 대상 이 추 가 된 Layout 를 PopuWindow 에 추가 하고 하위 항목 을 처리 하 는 팝 업 방식
2.RenderScript 를 적용 하여 고 스 퍼 지 실현
가우스 퍼 지 효 과 를 실현 하 는 방법 은 여러 가지 가 있 습 니 다.자바 로 실현 할 수 있 고 NDK 로 실현 할 수 있 으 며 본 고 에서 추천 하 는 방식 으로 실현 할 수 있 습 니 다(JNI 를 사용 하 는 방식 이기 도 합 니 다).왜 RenderScript 방식 으로 실현 하 는 지 에 대해 어느 정도 장점 이 있 을 것 입 니 다.
장점:RenderScript 방식,속도 가 매우 빠 르 고 자바 방식 의 100 배 속도,NDK 방식 의 20 배 속도(그림 품질 테스트 결과 에 따라 다 르 므 로 참고)
단점:API 17 이상 이 유효 합 니 다.(하지만 Google 은 아래 호 환 방법 을 제 공 했 습 니 다.
다음은 RenderScript 방식 을 사용 하 는 핵심 코드 입 니 다.
/************************
*
* @param bitmap
* @param context
* @return
***********************/
public static Bitmap blurBitmap(Bitmap bitmap, Context context) {
// bitmap bitmap
Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
// Renderscript, RenderScript context, RS , RenderScript ,
RenderScript rs = RenderScript.create(context);
//
ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
// Allocations, RenderScript ,
Allocation allIn = Allocation.createFromBitmap(rs, bitmap);
Allocation allOut = Allocation.createFromBitmap(rs, outBitmap);
// ( :Radius 25.f)
blurScript.setRadius(15.f);
// Perform the Renderscript
blurScript.setInput(allIn);
blurScript.forEach(allOut);
// Copy the final bitmap created by the out Allocation to the outBitmap
allOut.copyTo(outBitmap);
// recycle the original bitmap
bitmap.recycle();
// After finishing everything, we destroy the Renderscript.
rs.destroy();
return outBitmap;
}
이 방법 은 설명 이 명확 하지만 주의해 야 할 것 은 blurScript.setRadius()입 니 다.방법,이 방법 은 퍼 지 도 를 설정 할 때 Radius 는 최대 25.f 만 설정 할 수 있 고 그림 을 직접 처리 하면 퍼 지 효과 가 좋 지 않 을 수 있 으 므 로 이 값 은 최대 25 로 설정 할 수 있 으 나 더욱 깊이 있 는 퍼 지 효 과 를 실현 하려 면 먼저 그림 을 압축 하여 그림 의 질 을 낮 추어 더욱 모호 한 효 과 를 실현 할 수 있다.아래 는 그림 의 압축 처리 방법 입 니 다.
/**
* Compress image by pixel, this will modify image width/height.
*
* @param imgPath image path
* @param pixelW target pixel of width
* @param pixelH target pixel of height
* @return
*/
public static Bitmap ratio(String imgPath, float pixelW, float pixelH) {
BitmapFactory.Options newOpts = new BitmapFactory.Options();
// , options.inJustDecodeBounds true,
newOpts.inJustDecodeBounds = true;
newOpts.inPreferredConfig = Config.RGB_565;
// Get bitmap info, but notice that bitmap is null now
Bitmap bitmap = BitmapFactory.decodeFile(imgPath,newOpts);
newOpts.inJustDecodeBounds = false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
float ww = pixelW; // 120f,
float hh = pixelH; // 240f ,
// , ,
int be = 1;//
if (w > h && w > ww) { //
be = (int) (newOpts.outWidth / ww);
} else if (w < h && h > hh) { //
be = (int) (newOpts.outHeight / hh);
}
if (be <= 0) be = 1;
newOpts.inSampleSize = be;//
// , options.inJustDecodeBounds false
bitmap = BitmapFactory.decodeFile(imgPath, newOpts);
//
//return compress(bitmap, maxSize); // , ,
return bitmap;
}
이상 의 방법 은 렌 더 스 크 립 트 를 사용 하여 고 스 의 모호 한 핵심 코드 블록 과 주의해 야 할 부분 입 니 다.그러나 호환성 문제 에 주의해 야 한다.상기 에서 언급 한 바 와 같이 이 방법 은 API 17 이상 에 만 적용 되 어야 효과 가 있다.그러면 문제 가 생 겼 으 니 API 하향 호환성 문 제 를 처리 해 야 한다.3.API 아래로 호 환 문제 및 주의 점 처리
위 와 같은 방법 으로 고 스 의 모호 함 을 실현 한 후에 실행 해 보면 효과 가 가득 하고 성취 감 이 넘친다.이때 보스 는 마침 고객 을 데 리 고 와 서 젊은이 가 와 서 고객 에 게 최신 버 전(클 라 이언 트 핸드폰 시스템 버 전 은 Android 4.0)을 설치 하고 조금 후에...이거 참 어색 하군......!
bug 를 추적 할 때 다음 과 같은 오류 가 발생 할 수 있 습 니 다.
이상 정보 1:
09-21 15:07:34.417: E/AndroidRuntime(4476): android.support.v8.renderscript.RSRuntimeException: Error loading RS jni library: java.lang.UnsatisfiedLinkError: Couldn't load RSSupport: findLibrary returned null………………
이상 정보 2:
java.lang.NoClassDefFoundError: android.renderscript.ScriptIntrinsicBlur………………
해결 방안:
오류 메 시 지 는 android.support.v8.renderscript.RSRuntime Exception:Error loading 및 java.lang.Unsatisfied Link Error:Couldn't load RSSupport from loader dalvik.system.PathClassLoader 는 4.2 이상 의 휴대 전화 에 librsjni.so 와 libRSSupport.so 라 이브 러 리 가 있 기 때문에 4.2 이하 의 일부 휴대 전 화 는 이 두 개의 jni 라 이브 러 리 가 없습니다.그 러 니까 이 두 jni 를 우리 프로젝트 에 도입 하면 돼.그럼 서 류 는 어디 에 있 습 니까?
다음은 본인 의 파일 경로 입 니 다.C:\도구\android-sdk\build-tools\\23.0.3\renderscript\\lib\packaged,renderscript-v8.jar 패 키 지 는 renderscript\\lib 디 렉 터 리 에 있 습 니 다.
즉,android sdk 경로 에서 build-tools\각 버 전\renderscript\lib\packaged 의 네 개의 디 렉 터 리 입 니 다.jar 패키지 와.so 버 전의 선택 은 최신 을 선택 하 는 것 이 좋 습 니 다.예 를 들 어 24.0.0 에 x86-64 의 어댑터 가 추가 되 었 습 니 다.
자,여기까지 4.2 이하 버 전 을 완벽 하 게 호 환 할 수 있 습 니 다.또한 가장 중요 한 주의 점 이 하나 더 있 습 니 다.저 는 이 디 테 일 에 최소 2 시간 동안 시 달 렸 습 니 다.지금 생각해 보면 알 이 아 픕 니 다.위의 모든 일 을 끝 낸 후에 import 의 가방 경 로 를 바 꿀 수 있 습 니 다.import android.renderscript 은 import android.support.v8.renderscript 으로 바 꿀 수 있 습 니 다.구체 적 으로 다음 과 같다.
import android.support.v8.renderscript.Allocation;
import android.support.v8.renderscript.Element;
import android.support.v8.renderscript.RenderScript;
import android.support.v8.renderscript.ScriptIntrinsicBlur;
가장 마지막 으로 주의해 야 할 점 은 항목 에 코드 가 헷 갈 리 면 이것 을 잊 지 마 세 요.OK,여기까지 입 니 다.4.첨부:
고 스 의 모호 함 을 처리 하 는 GitHub 두 개 를 공유 합 니 다.
https://github.com/wl9739/BlurredView
https://github.com/robinxdroid/Blur
위 에서 말 한 것 은 소 편 이 소개 한 안 드 로 이 드 가 고 스 퍼 지 효 과 를 실현 하고 저 버 전의 모든 서술 을 호 환 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.