Android ScrollView 점성 헤드 코드 공유

앞에서 말 했 듯 이 하루 에 배달 을 시 킬 때 배 고 픈 지 목록 페이지 의 미끄럼 효과 가 좋 은 지 알 게 되 었 지만 그 중의 손짓 이 미 끄 러 지 는 것 이 매우 복잡 하 다 고 생각 했 습 니 다.마침 Touch 사건 에 대한 이해 에서 만 났 습 니 다.그래서 시간 을 내 서 배 고 픈 지 목록 페이지 에 이 효 과 를 쓰 려 고 했 습 니 다.
1.이 루어 진 효과 도 를 먼저 붙인다.
논 리 는 외부의 ScrollView 가 끝까지 미 끄 러 지지 않 을 때 위로 미 끄 러 질 때 외부의 ScrollView 를 미 끄 러 뜨 린 다 는 것 이다.외부의 ScrollView 가 바닥 에 도 착 했 을 때 우 리 는 다시 인터넷 에서 미 끄 러 지 는 것 이 내부 의 목록 을 미 끄 러 뜨리 는 것 이다.또한 좌우 로 미 끄 러 질 때 왼쪽 과 오른쪽 이 미 끄 러 지 는 거리 가 minPageSlop 보다 크 면 좌우 로 미 끄 러 지 는 것 이다.
다음은 배 고 픈 목록 페이지 를 모방 한 효과 그림 입 니 다.

2.도입

       build.gradle     jitpack repo  
allprojects {
 repositories {
  jcenter()
  maven { url "https://jitpack.io" }
 }
}
      module   library
dependencies { implementation 'com.github.WelliJohn:StickScrollView:0.0.3'
}
3.인터페이스의 레이아웃 설명

<wellijohn.org.stickscrollview.ScrollViewWithStickHeader
    android:id="@+id/stick_scroll_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1">
    <LinearLayout
      android:id="@+id/ll"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants"
      android:focusableInTouchMode="true"
      android:orientation="vertical">
      //   header  ,       
      </LinearLayout>
      <LinearLayout
        android:id="@+id/ll_stick_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
 <android.support.design.widget.TabLayout
  android:id="@+id/order_manager_tabs"
    android:layout_width="match_parent"
          android:layout_height="50dp"
          android:background="#FFFFFF"
          tools:tabGravity="fill"
          tools:tabMode="fixed" />
        <android.support.v4.view.ViewPager
          android:id="@+id/vp"
    android:layout_width="match_parent"
android:layout_height="wrap_content" />
      </LinearLayout>
    </LinearLayout>
</wellijohn.org.stickscrollview.ScrollViewWithStickHeader>
예 를 들 어 우리 가 본 배 고 픈 목록 페이지 인터페이스 에서 우 리 는 ViewPager 에 Fragment 를 설정 해 야 합 니 다.fragment 에서 좌우 두 개의 목록 입 니 다.fragment 의 xml 설정 을 보 세 요.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/ll"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="horizontal">
  <wellijohn.org.stickscrollview.ChildRecyclerView
    android:id="@+id/child_recyclerview"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:background="#EEEEEE" />
  <wellijohn.org.stickscrollview.ChildRecyclerView
    android:id="@+id/child_recyclerview_right"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:background="#FFFFFF"
    android:layout_weight="3" />
</LinearLayout>
4.주의사항
ScrollView With StickHeader 내 부 는 현재 ViewPager,ScrollView,RecyclerView,WebView ScrollView,RecyclerView,WebView 를 지원 합 니 다.ChildScrollView,ChildRecyclerView,ChildWebView 를 사용 할 때 mStickScrollView 를 호출 해 야 합 니 다.setContentView(mContentView);mLLStickList 는 우리 가 StickHeader+목록 이 필요 한 부분 입 니 다.만약 에 StickHeader 가 없다 면 목록 을 직접 설정 해서 들 어 와 도 됩 니 다.한 마디 로 하면 어느 위치 로 미 끄 러 지고 싶 은 지 다음 에 미 끄 러 지 는 것 은 단순 한 아래 부분 이 미 끄 러 지 는 것 입 니 다.그러면 아래 의 View 전 체 를 mContentView 로 설정 하 세 요.아까 그 콘 텐 츠 뷰 는 아 이 디 는 ll 입 니 다.stick_list 의 View.또한 이 곳 에서 ScrollView With Stick Header 는 autoscroll 속성 을 추가 합 니 다.기본적으로 닫 혀 있 습 니 다.autoscroll:true 라면 손가락 을 놓 을 때 contentView 는 자동 으로 위로 미 끄 러 지 는 지 숨 어 있 는 지 판단 합 니 다.
 
5.0.0.3 버 전 복 구 는 아래쪽 에 조작 표시 줄 이 있 을 때 인터페이스의 스크롤 에 오류 가 발생 합 니 다.
우리 밑 에 view 가 고정 되 어야 할 때,mStickScrollView.setBottomView(mView Bottom)를 통 해그러면 됩 니 다.다음 과 같 습 니 다.

6.모든 컨트롤 을 사용 할 때 우 리 는 그것 의 실현 방식 을 알 고 있 는 것 이 좋 습 니 다.그래서 여기 서 이 컨트롤 의 디자인 방향(Child ScrollView,Child RecyclerView,Child WebView 아래 의 것 을 모두 하위 ScrollView 라 고 부 릅 니 다)을 간단하게 소개 합 니 다.6.1.우 리 는 언제 외부 ScrollView 에 미끄럼 이 벤트 를 실행 시 켜 야 합 니까?언제 하위 ScrollView 에 미끄럼 을 실행 시 켜 야 합 니까?Android 에서 getParent().requestDisallow InterceptTouchEvent(true)방법 이 있 습 니 다.view 에 대응 하 는 이 벤트 를 가 져 오 는 것 입 니 다.6.2.view 의 touch 사건 을 어떻게 하 는 지 알 게 된 이상 어떤 상황 에서 부모 view 에 게 스크롤 사건 을 실행 시 켜 야 하 는 지,언제 하위 view 에 스크롤 사건 을 실행 시 켜 야 하 는 지 알 아야 합 니 다.아래 와 같이 나 는 표를 열거 했다.
아버지 ScrollVIEW
하위 스크롤 뷰
제스처 슬라이딩 방향
슬라이딩 이 벤트 는 어느 view 에 의 해 제어 되 지 않 습 니까?아래쪽 상단 에서 위로,아버지 ScrollView 는 아래쪽 상단 에서 아래로,아버지 ScrollView 아래쪽 은 상단 에서 위로,아들 ScrollView 아래쪽 은 상단 에서 아래로 ScrollView 아래쪽 상단 에서 아래로,아버지 ScrollView 아래쪽 상단 에서 위로,아들 ScrollView
여기 서 부모 ScrollView 가 아래쪽 에 없 을 때 하위 ScrollView 가 상단 에 없 는 경우 가 없 기 때문에 여기 서 분석 하지 않 습 니 다.
6.3.어떤 상황 에서 우 리 는 하위 ScrollVIEW 를 붙 잡 아야 합 니까?아니면 부모 ScrollView 에 미끄럼 사건 을 붙 잡 아야 합 니까?우 리 는 하위 ScrollView 에서 해당 하 는 코드 를 작성 하여 처리 할 수 있 습 니까?
아래 와 같이 ChildScrollView 의 onTouchEvent 방법 을 재 작성 합 니 다.다른 ChildRecyclerView 와 ChildWebView 처리 도 마찬가지 입 니 다.

@Override
public boolean onTouchEvent(MotionEvent event) {
  if (mScrollViewWithStickHeader == null) return super.onTouchEvent(event);
  int action = event.getAction();
  if (action == MotionEvent.ACTION_DOWN) {
    mLastX = event.getX();
    mLastY = event.getY();
    //      ScrollView       
    if (mScrollViewWithStickHeader.isBottom()) {
      getParent().requestDisallowInterceptTouchEvent(true);
      return super.onTouchEvent(event);
    } else {
      //          
      getParent().requestDisallowInterceptTouchEvent(false);
      return false;
    }
  }
  if (action == MotionEvent.ACTION_MOVE) {
    float nowY = event.getY();
    if (!mScrollViewWithStickHeader.isBottom() && !isScrolledToTop && nowY - mLastY > 0) {
      if (Math.abs(event.getX() - mLastX) < minPageSlop) {
        getParent().requestDisallowInterceptTouchEvent(true);
        return super.onTouchEvent(event);
      } else {
        getParent().requestDisallowInterceptTouchEvent(true);
        return false;
      }
    } else if (mScrollViewWithStickHeader.isBottom() && !isScrolledToBottom && nowY - mLastY < 0) {
      if (Math.abs(event.getX() - mLastX) < minPageSlop) {
        getParent().requestDisallowInterceptTouchEvent(true);
        return super.onTouchEvent(event);
      } else {
        getParent().requestDisallowInterceptTouchEvent(true);
        return false;
      }
    } else if (mScrollViewWithStickHeader.isBottom() && !isScrolledToTop && nowY - mLastY > 0) {
      if (Math.abs(event.getX() - mLastX) < minPageSlop) {
        getParent().requestDisallowInterceptTouchEvent(true);
        return super.onTouchEvent(event);
      } else {
        getParent().requestDisallowInterceptTouchEvent(true);
        return false;
      }
    } else {
      getParent().requestDisallowInterceptTouchEvent(false);
    }
  }
  if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
    getParent().requestDisallowInterceptTouchEvent(false);
  }
  return super.onTouchEvent(event);
}
이렇게 하면 우 리 는 머리 를 고정 시 키 는 ScrollView 를 실현 할 수 있다.
7. github 주소
이상 은 이번 편집장 이 정리 한 모든 내용 입 니 다.저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기