안 드 로 이 드 는 가우스 퍼 지 효 과 를 실현 하고 낮은 버 전 을 호 환 합 니 다.

효과 시범
프로젝트 에서 고 스 퍼 지 효 과 를 사 용 했 고 자 료 를 조회 한 적 이 있 습 니 다.성능 문 제 를 고려 하여 결국은 안 드 로 이 드 가 가지 고 있 는 렌 더 스 크 립 트 라 이브 러 리 를 사용 하여 이 루어 집 니 다.렌 더 스 크 립 트 를 사용 하여 고 스 퍼 지 인터넷 을 실현 하 는 데 도 비슷 한 방법 이 많 습 니 다.대부분 복잡 하 게 정리 되 었 습 니 다.여 기 는 비슷 한 수 요 를 가 진 학생 들 이 참고 하고 공부 할 수 있 도록 정리 한 셈 입 니 다.


(프로젝트 효과 도)
프로젝트 효과 그림 의 실현 방향 을 간단하게 설명 합 니 다.
① 정 의 된 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
위 에서 말 한 것 은 소 편 이 소개 한 안 드 로 이 드 가 고 스 퍼 지 효 과 를 실현 하고 저 버 전의 모든 서술 을 호 환 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기