Android 이미지 로드 프레임 Fresco 분석

Android 이미지 로드 프레임 Fresco 분석
태그(공백 구분): 안드로이드 프레임 이미지
ImageLoader와 달리 페이스북의 소스 프레임워크는 더 낮은 메모리 사용, 더 높은 맞춤형 사용을 결정한다.
Fresco 원리
Image Pipeline의 개념을 설계하여 메모리, 디스크 파일을 먼저 검사하고 존재하지 않으면 주어진 Url에서 다운로드한다.Fresco에는 세 개의 스레드 탱크가 있는데 그 중에서 세 개의 스레드는 네트워크에서 그림을 다운로드하는 데 사용되고 두 개의 스레드는 디스크 파일의 읽기와 쓰기에 사용되며 두 개의 스레드는 CPU 관련 조작(디코딩, 변환) 등을 담당한다.
Drawees 모듈은 그림을 불러오기 전에 비트맵을 표시하고 불러오기에 성공하면 자동으로 대상 그림으로 바꿉니다.그림이 더 이상 화면에 나타나지 않을 때, 메모리와 공간을 제때에 방출합니다.사용자 정의 초점 - 원각도 - 다운로드 실패 후 다시 다운로드 - 사용자 정의 비트맵 - 사용자 정의 오버레이 - 사용자 정의 진도표 - 사용자가 눌렀을 때의 오버레이 지정
Fresco의 Image Pipeline은 다음과 같은 다양한 방법으로 이미지 로드 프로세스를 사용자 정의할 수 있습니다.
  • HD 그래픽
  • 을 다운로드한 후 낮은 선명도 이미지를 표시할 수 있음
  • 로드 완료 후 콜백 알림
  • 본 지도는 EXIF 축소판이 있으면 미리 보기 그림을 표시하고 그림을 불러온 후에 큰 그림을 표시한다
  • 이미지 확대/회전 지원
  • 다운로드한 이미지를 다시 처리할 수 있음
  • 는 웹페이지 지원이 미비한 안드로이드 시스템에서도 WebP 디코딩을 지원합니다.

  • JPEG 포맷의 점진적인 안드로이드 자체의 이미지 라이브러리는 이 포맷을 지원하지 않지만 Fresco는 지원합니다.사용 시 여느 때와 마찬가지로 하나의 그림의 URI만 제공하면 되고 나머지는 Fresco가 처리한다.
    Gif 그림과 WebP 그림을 불러오는 것은 어떤 안드로이드 개발자의 눈에는 매우 골치 아픈 일이다.프레임마다 큰 비트맵이 있고 애니메이션마다 많은 프레임이 있다.Fresco는 모든 프레임을 잘 처리하고 메모리를 관리할 수 있도록 이런 고민을 없애준다.
    사용 방법
    라이브러리 가져오기
    dependencies { 
    compile 'com.squareup.picasso:picasso:2.5.2'
    }  

    초기화 Application 수준에서 Fresco 초기화
    public class TestApplication extends Application {
    
        @Override
        public void onCreate() {
            super.onCreate();
            Fresco.initialize(this);
        }
    }

    Layout에 네임스페이스 추가
    xmlns:fresco="http://schemas.android.com/apk/res-auto"

    네임스페이스를 추가하지 않으면
    Uri uri = Uri.parse(uri);
    imageView.setImageURI(uri);

    공통 속성
    "@+id/image_view"
            android:layout_width="300dp"
            android:layout_height="300dp"
            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" //   ,     ,   failureImage
            fresco:retryImageScaleType="centerCrop" //   
            fresco:progressBarImage="@drawable/progress_bar" //      
            fresco:progressBarImageScaleType="centerInside"
            fresco:progressBarAutoRotateInterval="1000"
            fresco:backgroundImage="@color/blue" //          
            fresco:overlayImage="@drawable/watermark" //    ,xml       。     
            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"
            />

    그림 로드 시작
    Uri uri = Uri.parse("https://raw.githubusercontent.com/facebook/fresco/gh-pages/static/logo.png");
    SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);
    draweeView.setImageURI(uri);

    동적 변경 사항
    set Controller(controller) 방법으로 그림 로드
    DraweeController controller = Fresco
                    .newDraweeControllerBuilder()
                    .setUri(uri).build();
            imageView.setController(controller);

    로드 프로세스 수신 ControllerListener
                    ControllerListener listener = new ControllerListener() {
    
                /**
                 * Called before the image request is submitted.
                 * 

    IMPORTANT: It is not safe to reuse the controller from within this callback! * * @param id controller id * @param callerContext caller context */

    @Override public void onSubmit(String id, Object callerContext) { // } /** * Called after the final image has been set. * * @param id controller id * @param imageInfo image info * @param animatable */ @Override public void onFinalImageSet(String id, Object imageInfo, Animatable animatable) { // } /** * Called after any intermediate image has been set. * * @param id controller id * @param imageInfo image info */ @Override public void onIntermediateImageSet(String id, Object imageInfo) { // } /** * Called after the fetch of the intermediate image failed. * * @param id controller id * @param throwable failure cause */ @Override public void onIntermediateImageFailed(String id, Throwable throwable) { // } /** * Called after the fetch of the final image failed. * * @param id controller id * @param throwable failure cause */ @Override public void onFailure(String id, Throwable throwable) { // } /** * Called after the controller released the fetched image. *

    IMPORTANT: It is not safe to reuse the controller from within this callback! * * @param id controller id */

    @Override public void onRelease(String id) { // } };

    단일 모드의 기본 ControllerListener 인터페이스 호출을 더욱 간소화합니다.
    ControllerListener controllerListener = BaseControllerListener.getNoOpListener();

    ControllerListener 사용 방법
    DraweeController controller = Fresco.newDraweeControllerBuilder()
                    .setUri(uri)
                    .setControllerListener(listener)
                    .build();
            imageView.setController(controller);

    동적 생성,GenericDraweeHierarchy 동적 설정 재사용
    GenericDraweeHierarchy hierarchy = new GenericDraweeHierarchyBuilder(getResources())
                    .setFadeDuration(300)
                    .setBackground(getDrawable(R.drawable.ic_launcher))
                    .setPlaceholderImage(getDrawable(R.drawable.ic_launcher))
                    .setFailureImage(getDrawable(R.drawable.ic_launcher))
                    .build();
            imageView.setHierarchy(hierarchy);

    GenericDraweeHierarchy 재사용
    GenericDraweeHierarchy hierarchy1 = imageView.getHierarchy();

    JPEG 점진적 네트워크 로딩 점진적 로딩은 네트워크 조건이 좋지 않을 때 사용자 경험을 향상시키는 희미한 점진적 프로세스입니다.점진적 인 로드 도 제어할 수 있으며, 아래 는 인터페이스 이다
    public interface ProgressiveJpegConfig {
    
      /**
       * Gets the next scan-number that should be decoded after the given scan-number.
       */
      int getNextScanNumberToDecode(int scanNumber);
    
      /**
       * Gets the quality information for the given scan-number.
       */
      QualityInfo getQualityInfo(int scanNumber);
    }

    Fresco는 간단한 제어 방식의 예를 제공합니다.
    ProgressiveJpegConfig progressiveJpegConfig = new SimpleProgressiveJpegConfig(list, 2);

    Fresco는 매우 전면적이고 강력한 이미지 로드 프레임워크로 원본 코드를 읽으며 그의 디자인과 사용을 더욱 이해할 수 있다.
    Github 주소 소개

    좋은 웹페이지 즐겨찾기