android 플러그 인 스크롤 입문 실천

플러그 인 스크롤 은 Android OS 5.0 이후 Google 이 제공 하 는 새로운 기능 입 니 다.이런 메커니즘 은 우리 가 이전의 안 드 로 이 드 전통 적 인 사건 처리 에 대한 인식 을 깨뜨렸다.일정한 의미 에서 플러그 인 스크롤 은 역방향 이벤트 전달 메커니즘 으로 이해 할 수 있다.

위의 그림 에서 보 듯 이 그 원 리 는 바로 이렇다.그럼 다음은 코드 차원 에서 실현 을 살 펴 보 겠 습 니 다.
코드 에는 주로 네 가지 종류 가 포함 되 어 있 습 니 다.
NestedScrollingChild、NestedScrollingChildHelper、NestedScrollingParent、NestedScrollingParentHelper
Nested Scrolling Child 인터페이스 에서 정의 하 는 방법 을 먼저 봅 니 다. 

public interface NestedScrollingChild {
  /**
   *           
   */
  public void setNestedScrollingEnabled(boolean enabled);

  /**
   *           
   */
  public boolean isNestedScrollingEnabled();

  /**
   *          
   * @param axes     ,  x, y       0
   */
  public boolean startNestedScroll(int axes);

  /**
   *       
   */
  public void stopNestedScroll();

  /**    
   *     view         
   */
  public boolean hasNestedScrollingParent();

  /**
   *       ,    onTouch/onInterceptTouchEvent/dispatchTouchEvent    
   * @param dxConsumed x      
   * @param dyConsumed y       
   * @param dxUnconsumed x         
   * @param dyUnconsumed y         
   * @param offsetInWindow   View      
   */
  public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed,
      int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow);

  /**
   *       ,         
   */
  public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow);

  /**
   *       ,      
   */
  public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed);

  /**
  *       ,       
   */
  public boolean dispatchNestedPreFling(float velocityX, float velocityY);
}
NestedScrollingParent          NestedScrollingChild          :
 
public interface NestedScrollingParent {

  public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes);

  public void onNestedScrollAccepted(View child, View target, int nestedScrollAxes);

  public void onStopNestedScroll(View target);

  public void onNestedScroll(View target, int dxConsumed, int dyConsumed,
      int dxUnconsumed, int dyUnconsumed);

  public void onNestedPreScroll(View target, int dx, int dy, int[] consumed);

  public boolean onNestedFling(View target, float velocityX, 
                           float velocityY,boolean consumed);
 
  public boolean onNestedPreFling(View target, float velocityX, float velocityY);

  public int getNestedScrollAxes();
}

상기 두 가지 유형 은 기능 인 터 페 이 스 를 정 의 했 을 뿐 실제 실 현 된 코드 는 모두 Nested Scrolling ChildHelper 와 Nested Scrolling ParentHelper 에 포함 되 어 있다.
처리 절차:
1.Nested Scrolling Child(아래 는 Child 로 대체)가 미 끄 러 지기 시작 할 때 onStartNested Scroll 을 호출 한 다음,에이전트 클래스 Nested Scrolling ChildHelper(아래 는 ChildHelper 로 대체)의 onStartNested Scroll 을 최근 의 Nested Scrolling Parent(아래 는 Parent 로 대체)에 게 요청 합 니 다.
2.ChildHelper 의 onStartNested Scroll 방법 이 true 로 돌아 가 Scroll 사건 을 함께 처리 하 는 것 에 동의 할 때 ChildHelper 는 Parent 에 onNested Scroll Accepted 에 게 준비 동작 을 하 라 고 통지 합 니 다.
3.Child 가 미 끄 러 지기 시작 할 때 먼저 onNested PreScroll 을 보 내 고 Child Helper 의 onNested PreScroll 에 게 Parent 에 게 내 가 지금 얼마나 미 끄 러 져 야 하 는 지 알려 달라 고 요청 합 니 다.괜 찮 을 것 같 습 니까?이때 Parent 는 실제 상황 에 따라 Child 에 게 현재 몇 거리 만 미 끄 러 질 수 있 는 지 알려 줍 니 다.그리고 ChildHelper 는 onNested PreScroll 에서 반 환 된 정보 에 따라 미 끄 러 지 는 거 리 를 상응 하 게 조정 합 니 다.
4.미 끄 러 지 는 과정 에서 Child 는 onNested Scroll 을 보 내 ChildeHelpaer 의 onNested Scroll 에 게 Parent 현재 Child 의 미끄럼 상황 을 알려 줍 니 다.
5.활주 할 때,먼저 onNested Fling 을 보 내 서 Parent 에 게 내 가 지금 활주 할 것 이 라 고 말 해 줄 것 입 니 다.괜 찮 겠 습 니까?이 럴 때 Parent 는 상황 에 따라 Child 에 게 활주 할 수 있 는 지 여 부 를 알려 줄 것 입 니 다.
6.Child 는 onNested Fling 을 통 해 되 돌아 오 는 Boolean 값 을 통 해 활주 여 부 를 판단 합 니 다.활주 하려 면 활주 할 때 onNested Fling 알림 을 보 내 Parent 활주 상황 을 알 립 니 다.
7.미끄럼 이벤트 가 끝나 면 child 는 onStopNested Scroll 을 보 내 부모님 께 관련 작업 을 하 라 고 알 립 니 다.
쓸데없는 소리 하지 마 세 요.코드 와 demo 를 보 는 것 이 중요 합 니 다https://github.com/JeffWangGithub/StickLayout
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기