Android 는 Scroller 로 위로 미 끄 러 질 수 있 는 아래쪽 탐색 표시 줄 을 구현 합 니 다.

5 분 을 조용히 기 다 렸 는데 내 첫 글 을 어떻게 써 야 할 지 몰 랐 다.매번 열심히 공부 하고 싶 습 니 다.시간 이 있 으 면 코드 를 많이 두 드 리 고 자신의 글 을 몇 편 쓰 고 싶 습 니 다.오늘 마침내 실행 하기 시 작 했 는데,여전히 약간 흥분 되 었 다.하하!
됐어.잔말 말고 그만 받 아.내 가 오늘 실현 하고 싶 은 기능 중 하 나 는 바로 아래쪽 메뉴 표시 줄 을 올 라 갈 수 있 는 것 이다.왜 내 가 이런 물건 을 만 들 고 싶 었 을 까?아니면 1 년 전에 우리 app 이 이런 수 요 를 가지 고 있 었 기 때 문 일 까?그 당시 에 바 이 두 도 구 글 도 원 하 는 효 과 를 찾 지 못 했 고 사실은 간단 한 효 과 를 얻 었 다.하지만 그 때 는 저도 정말 너무 엉망 이 었 습 니 다.사용자 정의 에 관 한 모든 컨트롤 은 정말 할 줄 몰 랐 습 니 다.다른 사람의 코드 를 보 니 괜 찮 았 습 니 다.정말 제 가 쓰 면 갈 피 를 잡 을 수 없 었 습 니 다.내 가 써 봤 으 니까,정말 안 되 겠 어.그 때 는 자신 이 매우 폐기 적 이 라 고 생각 했 습 니 다.모든 효 과 는 다른 사람의 것 이 고 자신 도 쓸 줄 몰 랐 습 니 다.사용자 정의 컨트롤 도 잘 하기 로 했 고 미 루 고 미 루 면 지금 이다.한동안 사용자 정의 컨트롤 을 알 고 나 서 이 효과 가 생각 나 서 그 에 게 해 주 었 다.
효과 보기:

우선 이 컨트롤 은 미 끄 러 지 는 것 이 므 로 scrollto()나 scrollBy(),scroller 류 를 사용 할 것 입 니 다.그럼 이 세 가 지 를 간단히 소개 하 겠 습 니 다.
scrollto(int,int)와 scrollBy(int,int)
  • scrollTo 는 View 의 content 를 View 의 초기 위치(x,y)로 스크롤 합 니 다.
  • scrollBy 는 View 의 content 를 View 의 현재 위치(x,y)에 비해 스크롤 합 니 다.
  • 스크롤 러 클래스
    Scroller 는 손가락 이 미 끄 러 지 는 데 있어 서 비교적 중요 한 보조 클래스 로 개발 자가 매 끄 러 운 스크롤 을 완성 하 는 데 도움 을 줄 수 있 습 니 다.그 주요 내용 은:
  • startScroll(int startX, int startY, int dx, int dy)startScroll(int startX, int - startY, int dx, int dy, int duration).
  • startX,x 방향 은 어디서부터 이동 합 니까?
  • startY,y 방향 은 어디서부터 이동 합 니까?
  • dx,x 방향 이동 이 얼마나 됩 니까?
  • dy,y 방향 은 얼마나 멀리 이동 합 니까?
  • duration,이 이동 작업 은 얼마나 걸 립 니까?기본 값 은 250 밀리초 입 니 다.
  • 이 종 류 를 진정 으로 사용 하려 면 컴퓨터 스크롤()방법 에 맞 춰 야 합 니 다.이 방법 다시 쓰기
    
    @Override
    public void computeScroll() {
      if (mScroller.computeScrollOffset()) { //      ,            。
         scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
         invalidate();//     computeScroll。
      }
    }
    computeScrollOffset()이 방법 은 현재 알 고 싶 은 새로운 위 치 를 계산 하 는 데 사 용 됩 니 다.Scroller 는 표 시 된 좌표,시간,현재 위치 에 따라 새로운 위 치 를 계산 하여 내부 에 기록 합 니 다.우 리 는 Scroller\#getCurrX()와 Scroller\#getCurrY()를 통 해 얻 을 수 있 는 새로운 위 치 를 계산 할 수 있 습 니 다.
    알 아야 할 것 은,그것 이 계산 한 새로운 위 치 는 닫 힌 구간[x,y]이 며,startScroll 을 호출 하여 들 어 오 는 시간 내 에 지정 한 int startX 와 int startY 에서 int dx 와 int dy 의 거 리 를 점점 이동 하기 때문에,우 리 는 매번 Scroller\#coptute Scroll Offset()를 호출 한 후에 View 의 scrollTo(int,int)그리고 Scroller\#getCurrX()와 Scroller\#getCurrY()를 입력 하면 점점 이동 하 는 효 과 를 얻 을 수 있 습 니 다.
    이 방법 은 boolean 형식의 반환 값 이 있 습 니 다.내 부 는 boolean 으로 완료 여 부 를 기록 합 니 다.Scroller\#startScroll)를 호출 할 때 이 boolean 인 자 를 false 로 설정 합 니 다.내부 논 리 는 startScroll()애니메이션 이 계속 되 고 있 는 지,완성 되 지 않 으 면 최신 위 치 를 계산 하고 최신 위 치 를 계산 하기 전에 duration 에 대해 판단 하 는 것 입 니 다.첫째,시간 이 되 지 않 으 면 진정한 위 치 를 계산 하고 true 로 돌아 갑 니 다.둘째,시간 이 되면 계속 되 는 boolean 멤버 변 수 를 표시 합 니 다.그리고 최신 위 치 를 최종 목적 위치 로 직접 할당 하고 true 로 돌아 갑 니 다.startScroll()이 완료 되면 false 로 돌아 갑 니 다.Scroller\#compute ScrollOffset()이 true 라 고 판단 할 때 설명 이 완료 되 지 않 았 습 니 다.이 때 Scroller\#getCurrX()와 Scroller\#getCurrY()를 가 져 와 스크롤 을 합 니 다.Scroller#getCurrX() Scroller#getCurrY()이 두 가지 방법 은 Scroller\#coptute Scroll Offset()를 통 해 계 산 된 새로운 위 치 를 가 져 오 는 것 입 니 다.위 에서 도 설명 되 었 습 니 다.Scroller.isFinished() 지난번 애니메이션 이 완성 되 었 습 니까?Scroller.abortAnimation() 지난번 애니메이션 을 취소 합 니 다.
    자,이 걸 알 고 이 효 과 를 실현 하 겠 습 니 다.
    먼저 아래쪽 네 비게 이 션 표시 줄 의 머리 와 네 비게 이 션 표시 줄 의 내용 체 를 포함 하여 구 조 를 만 듭 니 다.
    
    <com.study.androidtest.BottomBar
        android:orientation="vertical"
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <LinearLayout
          android:background="@color/colorAccent"
          android:layout_width="match_parent"
          android:layout_height="50dp">
    
        </LinearLayout>
    
        <LinearLayout
          android:background="@color/colorPrimaryDark"
          android:layout_width="match_parent"
          android:layout_height="200dp">
    
        </LinearLayout>
      </com.study.androidtest.BottomBar>
    
    
    효과 도 를 맞추다.

    아주 간단 한 효과(여 기 는 효과 만 보고 UI 는 보지 않 는 다).파란색 은 내용 이 고 빨간색 은 머리 다.
    그러면 저 는 어떤 효 과 를 실현 하고 싶 습 니까?바로 처음에 파란색 부분 이 보이 지 않 았 습 니 다.빨간색 부분 을 클릭 하거나 미 끄 러 지면 파란색 부분,위 당 김 과 아래 당 김 효 과 를 나 타 낼 수 있 습 니 다.그러면 지금 은 반드시 자체 적 인 view Group 을 실현 하여 이 구 조 를 실현 해 야 한다.
    우선 저 는 BottomBar.class 를 만 들 겠 습 니 다.간단 하기 위해 서 저 는 직접 그것 으로 LinearLayout 를 계승 하 겠 습 니 다.onLayout()방법 을 다시 쓰 십시오.파란색 부분 을 숨 기 고 빨간색 부분 만 남 겨 야 하기 때문이다.어떻게 할 까요?코드 는 다음 과 같 습 니 다.
    
     @Override
      protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        bottomBar.layout(0, getMeasuredHeight() - bottomBar.getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight());
        bottomContent.layout(0, getMeasuredHeight(), getMeasuredWidth(), bottomBar.getBottom() + bottomContent.getMeasuredHeight());
      }
    onLayout() 방법 으로 위 치 를 바 꿔 파란색 부분 을 숨 깁 니 다.
    다음은 미끄럼 사건 을 처리 하 는 겁 니 다.빨간색 부분 을 누 르 고 위아래 로 미끄러져 파란색 부분 을 표시 하고 숨 기 려 면 제스처 인식 이 있어 야 한다.onTouchEvent() 을 다시 쓰 고 view 의 scrollTo() 방법 에 맞 추 면 이 간단 한 효 과 를 실현 할 수 있다.
    
    @Override
      public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        switch (event.getAction()){
          case MotionEvent.ACTION_DOWN:
            Log.i("", "--------->x="+event.getX() + ", y="+event.getY());
            downX = (int) event.getX();
            downY = (int) event.getY();
            break;
          case MotionEvent.ACTION_MOVE:
            int endY = (int) event.getY();
            int dy = (int) (endY - downY);
            int toScroll = getScrollY() - dy;
            if(toScroll < 0){
              toScroll = 0;
            } else if(toScroll > bottomContent.getMeasuredHeight()){
              toScroll = bottomContent.getMeasuredHeight();
            }
            scrollTo(0, toScroll);
            downY = (int) event.getY();
            break;
          case MotionEvent.ACTION_UP:
            scrollOffset = getScrollY();
            if(scrollOffset > bottomContent.getMeasuredHeight() / 2){
              showNavigation();
            } else {
              closeNavigation();
            }
            break;
        }
    
        return true;
      }
    
    
    코드 가 게 을 러 서 주석 이 없 지만 아래 에서 설명 하 겠 습 니 다.모두 간단 한 논리 입 니 다.먼저 ACTIONDOWN 안의 코드 는 누 른 좌표 만 기록 되 어 있 을 뿐 아무것도 아 닙 니 다.그리고 ACTIONMOVE 코드.우선 getScrolly()를 알 아야 합 니 다.컨트롤 이 미 끄 러 지 는 거리 이 고 초기 값 은 0 입 니 다.내 가 scrollTo(0,toScroll)를 호출 하고 toScroll=getScrolly()-dy 를 호출 하 는 것 을 볼 수 있 습 니 다.디 는 손가락 이 미 끄 러 지 는 편 이 량 이다.이 계산 을 통 해 toScroll 이 파란색 부분의 높이 라 는 것 을 알 게 될 것 이다.그러면 효 과 는 이미 실현 되 었 습 니 다.간단 하 죠?본 후에 당신들 은 이런 의문 이 있 을 수 있 습 니까?그리고 제 가 그때 의 의문 이 었 습 니 다.그것 은 바로 우리 가 D,즉 손가락 이 미 끄 러 지 는 거 리 를 toScroll 의 값 으로 직접 사용 하지 않 는 이유 입 니 다.사실 가능 합 니 다.컨트롤 은 손가락 에 따라 미 끄 러 집 니 다.하지만 손가락 이 화면 을 벗 어 나 다시 클릭 하면 메뉴 가 다시 원래 상태 로 돌아 가 미 끄 러 집 니 다.그렇다면 왜 이런 효 과 를 가 져 왔 을 까?자세히 보면 클릭 할 때마다 D 는 0 이기 때문에 scrollTo(x,y)를 호출 할 때마다 x,y 는 0 이 고 자연 메뉴 는 초기 위치 로 돌아간다.그래서 getScrolly()-dy 는 사실 지난번 위 치 를 다시 기록 하여 다음 클릭 시'y'의 값 이 0 이 아 닙 니 다.전 제 는 매번 다운 Y 에 대한 값 을 다시 부여 해 야 한 다 는 것 이다.됐어.그러나 이것 만 으로 는 안 된다.우 리 는 그것 이 자동 으로 튀 어 나 오고 회수 할 수 있 도록 해 야 한다.다음은 ACTIONUP 시 처리 하고 쇼 Navigation()을 호출 했 습 니 다.colseNavigation();코드 는 다음 과 같이 간단 한 논리 로 해석 하지 않 습 니 다.
    
      private void showNavigation(){
        int dy = bottomContent.getMeasuredHeight() - scrollOffset;
        mScroller.startScroll(getScrollX(), getScrollY(), 0, dy, 500);
        invalidate();
      }
    
      private void closeNavigation(){
        int dy = 0 - scrollOffset;
        mScroller.startScroll(getScrollX(), getScrollY(), 0, dy, 500);
        invalidate();
      }
    
    
    효과 가 이 루어 졌 군,하하.정말 간단 해.여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

    좋은 웹페이지 즐겨찾기