Fresco 소스 코드 분석 - Hierarachy - View - Controller

Fresco 은 MVC 모델 로 세 가지 구성 요소 로 구성 되 는데 그들의 대응 관 계 는 다음 과 같다.
  • M -> DraweeHierarchy
  • V -> DraweeView
  • C -> DraweeController

  • M 에 대응 하 는 DraweeHierarchy 은 계층 적 구조 가 있 는 데이터 구조 로 DraweeViewDraweeHierarchy 맨 위 에 있 는 이미지 (top level drawable) 를 표시 하고 DraweeControllerDraweeHierarchy 의 맨 위 이미지 가 어느 것 인지 제어 하 는 데 사용 된다.
     o FadeDrawable (top level drawable)
     |
     +--o ScaleTypeDrawable
     |  |
     |  +--o BitmapDrawable
     |
     +--o ScaleTypeDrawable
        |
        +--o BitmapDrawable
    

    세 사람의 상호작용 관 계 는 매우 간단 하 다. DraweeView 획득 한 EventController 에 전달 한 다음 ControllerEvent 에 따라 (애니메이션 포함) 그림 을 표시 하고 숨 길 지 여 부 를 결정 한다. 이 그림 들 은 모두 Hierarchy 에 저장 되 고 마지막 DraweeView 에 그 릴 때 getTopLevelDrawable 를 통 해 표시 할 그림 을 직접 얻 을 수 있다.
    주의해 야 할 것 은 현재 최신 코드 중 DraweeView 은 계승 ImageView 이지 만 나중에 직접 계승 View 하기 때문에 우리 가 DraweeView 을 사용 할 때 ImageView 의 API 를 사용 하지 않도록 하 는 것 이다. 예 를 들 어 setImageXxx, setScaleType 주석 에 도 명확 하 게 쓰 여 있다.
    Although ImageView is subclassed instead of subclassing View directly, this class does not support ImageView’s setImageXxx, setScaleType and similar methods. Extending ImageView is a short term solution in order to inherit some of its implementation (padding calculations, etc.). This class is likely to be converted to extend View directly in the future, so avoid using ImageView’s methods and properties (T5856175).
    관계 도 를 통 해 알 수 있 듯 이 DraweeView 에는 DraweeHierarchyDraweeController 유형의 구성원 변수 가 없 으 며 하나의 DrawHolder 유형 mDrawHolder 만 있다.
    public class DraweeHolder<DH extends DraweeHierarchy> implements VisibilityCallback {
      // other properties
    
      private DH mHierarchy;
      private DraweeController mController = null;
    
      // methods
    }
    DraweeHolder 저장 mHierarchymController, FB 는 왜 이렇게 디자인 합 니까?주석 에 도 분명하게 쓰 여 있다.
    Drawee users, should, as a rule, use DraweeView or its subclasses. There are situations where custom views are required, however, and this class is for those circumstances.
    조금 만 설명 하 겠 습 니 다. 이것 은 디 결합 디자인 입 니 다. 우리 가 사용 하고 싶 지 않 을 때 DraweeView 를 통 해 다른 두 구성 요 소 를 사용 할 수 있 습 니 다.예 를 들 어 사용자 정의 ViewHolder 를 한 다음 View 처럼 DraweeViewView 의 구성원 변 수 를 추가 합 니 다.
    다시 보기 DrawHolder 의 코드:
    public class DraweeView<DH extends DraweeHierarchy> extends ImageView {
      // other methods and properties
    
      /** Sets the hierarchy. */
      public void setHierarchy(DH hierarchy) {
        mDraweeHolder.setHierarchy(hierarchy);
        super.setImageDrawable(mDraweeHolder.getTopLevelDrawable());
      }
    
      /** Sets the controller. */
      public void setController(@Nullable DraweeController draweeController) {
        mDraweeHolder.setController(draweeController);
        super.setImageDrawable(mDraweeHolder.getTopLevelDrawable());
      }
    }
    DraweeView 설정 DraweeView 또는 hierarchy 일 때마다 controller 을 통 해 표시 할 그림 을 동시에 업데이트 합 니 다.
    /** * Gets the top-level drawable if hierarchy is set, null otherwise. */
    public Drawable getTopLevelDrawable() {
      return mHierarchy == null ? null : mHierarchy.getTopLevelDrawable();
    }
    super.setImageDrawable(mDraweeHolder.getTopLevelDrawable()) 한 가지 방법 만 정 의 했 습 니 다. - DraweeHierarchy
    public interface DraweeHierarchy {
    
      /** * Returns the top level drawable in the corresponding hierarchy. Hierarchy should always have * the same instance of its top level drawable. * @return top level drawable */
      public Drawable getTopLevelDrawable();
    }
    getTopLevelDrawable 도 하나의 인터페이스 로 설치 DraweeController 와 수신 hierarchy 방법 이 노출 되 었 다.
  • Event
  • void setHierarchy(@Nullable DraweeHierarchy hierarchy)
  • /** * Interface that represents a Drawee controller used by a DraweeView. * <p> The view forwards events to the controller. The controller controls * its hierarchy based on those events. */
    public interface DraweeController {
    
      /** Gets the hierarchy. */
      @Nullable
      public DraweeHierarchy getHierarchy();
    
      /** Sets a new hierarchy. */
      void setHierarchy(@Nullable DraweeHierarchy hierarchy);
    
      /** * Called when the view containing the hierarchy is attached to a window * (either temporarily or permanently). */
      public void onAttach();
    
      /** * Called when the view containing the hierarchy is detached from a window * (either temporarily or permanently). */
      public void onDetach();
    
      /** * Called when the view containing the hierarchy receives a touch event. * @return true if the event was handled by the controller, false otherwise */
      public boolean onTouchEvent(MotionEvent event);
    
      /** * For an animated image, returns an Animatable that lets clients control the animation. * @return animatable, or null if the image is not animated or not loaded yet */
      public Animatable getAnimatable();
    
    }

    상기 분석 을 통 해 알 수 있 듯 이 public boolean onTouchEvent(MotionEvent event), DraweeController 세 사람 은 공동으로 DraweeHierarchy 의 트로이 카 를 구성 하고 아래 의 박문 회 는 각각 격파 하여 그들의 실현 원리 와 코드 차원 을 분석 했다.

    좋은 웹페이지 즐겨찾기