Fresco 소스 코드 분석 - Hierarachy - View - Controller
Fresco
은 MVC 모델 로 세 가지 구성 요소 로 구성 되 는데 그들의 대응 관 계 는 다음 과 같다.M 에 대응 하 는
DraweeHierarchy
은 계층 적 구조 가 있 는 데이터 구조 로 DraweeView
는 DraweeHierarchy
맨 위 에 있 는 이미지 (top level drawable) 를 표시 하고 DraweeController
는 DraweeHierarchy
의 맨 위 이미지 가 어느 것 인지 제어 하 는 데 사용 된다. o FadeDrawable (top level drawable)
|
+--o ScaleTypeDrawable
| |
| +--o BitmapDrawable
|
+--o ScaleTypeDrawable
|
+--o BitmapDrawable
세 사람의 상호작용 관 계 는 매우 간단 하 다.
DraweeView
획득 한 Event
을 Controller
에 전달 한 다음 Controller
은 Event
에 따라 (애니메이션 포함) 그림 을 표시 하고 숨 길 지 여 부 를 결정 한다. 이 그림 들 은 모두 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
에는 DraweeHierarchy
과 DraweeController
유형의 구성원 변수 가 없 으 며 하나의 DrawHolder
유형 mDrawHolder
만 있다.public class DraweeHolder<DH extends DraweeHierarchy> implements VisibilityCallback {
// other properties
private DH mHierarchy;
private DraweeController mController = null;
// methods
}
DraweeHolder
저장 mHierarchy
과 mController
, 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
처럼 DraweeView
에 View
의 구성원 변 수 를 추가 합 니 다.다시 보기
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
의 트로이 카 를 구성 하고 아래 의 박문 회 는 각각 격파 하여 그들의 실현 원리 와 코드 차원 을 분석 했다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
클린 아키텍처의 Presenter를 이해하기 어려운 것은 MVC 2가 아니기 때문에클린 아키텍처에는 구체적인 클래스 구성 예를 보여주는 다음 그림이 있습니다. 이 그림 중에서 Presenter와 Output Boundary(Presenter의 인터페이스)만 구체 구현을 이미지하는 것이 매우 어렵다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.