본문
160321A(월)
Fresco
bulid.gradle
compile 'com.facebook.fresco:fresco:0.5.0+'
setContentView() 전에 init
Fresco.initialize(context);
XML
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:fresco="http://schemas.android.com/apk/res-auto" android:layout_height="match_parent" android:layout_width="match_parent">
<com.facebook.drawee.view.SimpleDraweeView android:id="@+id/my_image_view" android:layout_width="130dp" android:layout_height="130dp" fresco:placeholderImage="@drawable/my_drawable" />
Java Code
Uri uri = Uri.parse("http://frescolib.org/static/fresco-logo.png"); SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view); draweeView.setImageURI(uri);
Concept
Drawees
이미지가 구현되는 공간
MVC와 같이 3가지 컴포넌트로 구성
DraweeView
android의 view 상속
XML에서 커스터마이징 가능
DraweeHierarchy
Drawable 상속
Model이며 이미지를 Java에서 커스텀하여 표현하고 싶을 때 사용
DraweeController
이미지 로딩, 파이프라인 등 실질적인 기능 담당
URI 말고 더 많은것을 화면에 전달하고 표시하고 싶을 때 사용
DraweeControllerBuilder
DraweeControllers는 한번 생성되면 바꿀 수 없다.
Builder 패터으로 만들어짐
Listeners
builder로 만들어 졌으며,
이미지가 모두 혹은 부분적으로 받아졌을 때 실행
Image Pipeline
Fresco는 내부적으로 파이프라인을 사용하여 이미지 처리작업을 다룬다.
pinned purgeables 기술 사용
이미지 작업 완료시 close 필요
보통은 SimpleDraweeView가 자동으로 관리
URI
절대경로 & scheme
상대경로는 지원 안함
Type | Scheme | Fetch method used |
---|---|---|
네트워크의 파일 | http://, https:// | HttpURLConnection 혹은 네트워크 레이어 |
단말의 파일 | file:// | FileInputStream |
컨텐트 프로비더 | content:// | ContentResolver |
앱의 Asset | asset:// | AssetManager |
앱의 리소스 | res:// | Resources.openRawResource |
XML 속성
fresco:fadeDuration="300" fresco:actualImageScaleType="focusCrop" fresco:placeholderImage="@color/wait_color" fresco:placeholderImageScaleType="fitCenter" fresco:failureImage="@drawable/error" fresco:failureImageScaleType="centerInside" fresco:retryImage="@drawable/retrying" fresco:retryImageScaleType="centerCrop" fresco:progressBarImage="@drawable/progress_bar" fresco:progressBarImageScaleType="centerInside" fresco:progressBarAutoRotateInterval="1000" fresco:backgroundImage="@color/blue" fresco:overlayImage="@drawable/watermark" fresco:pressedStateOverlayImage="@color/red" fresco:roundAsCircle="false" fresco:roundedCornerRadius="1dp" fresco:roundTopLeft="true" fresco:roundTopRight="false" fresco:roundBottomLeft="false" fresco:roundBottomRight="true" fresco:roundWithOverlayColor="@color/corner_color" fresco:roundingBorderWidth="2dp" fresco:roundingBorderColor="@color/border_color"
높이와 넓이는 반드시 선언할 것.
wrap_content는 지원하지 않는다. 쓰지말자
Image Pipeline
1. 비트맵 캐시를 찾아서, 찾으면 돌려줌
2. 다른 쓰레드에게 역할을 넘김
3. 인코딩된 메모리 캐시를 체크, 발견하면 디코딩하고 변환해 돌려주고 비트맵 캐시에 저장
4. 디스크 캐시를 체크, 발견하면 디코딩하고 변환해 돌려주고 비트맵 캐시에 저장. 비트맵 캐시와 인코드된 메모리에 저장
5. 네트워크 또는 다른 원본소스를 체크, 발견하면 디코드하고 변환하여 돌려준다. 메모리, 비트맵, 디스크캐시에 저장
Fresco.initialize(context); 보다 더 향상된 커스텀
ImagePipelineConfig를 사용
ImagePipelineConfig config = ImagePipelineConfig.newBuilder() .setBitmapMemoryCacheParamsSupplier(bitmapCacheParamsSupplier) .setCacheKeyFactory(cacheKeyFactory) .setEncodedMemoryCacheParamsSupplier(encodedCacheParamsSupplier) .setExecutorSupplier(executorSupplier) .setImageCacheStatsTracker(imageCacheStatsTracker) .setMainDiskCacheConfig(mainDiskCacheConfig) .setMemoryTrimmableRegistry(memoryTrimmableRegistry) .setNetworkFetchProducer(networkFetchProducer) .setPoolFactory(poolFactory) .setProgressiveJpegConfig(progressiveJpegConfig) .setRequestListeners(requestListeners) .setSmallImageDiskCacheConfig(smallImageDiskCacheConfig) .build(); Fresco.initialize(context, config);
'Mobile > Android' 카테고리의 다른 글
160329A(화) (0) | 2016.03.29 |
---|---|
160326P(토) (0) | 2016.03.26 |
160319A(토) (0) | 2016.03.19 |
160302P(수) (0) | 2016.03.03 |
160210P(수) (0) | 2016.02.11 |
댓글