본문

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
앱의 Assetasset://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

공유

댓글