Android 는 Scroller 로 위로 미 끄 러 질 수 있 는 아래쪽 탐색 표시 줄 을 구현 합 니 다.
8280 단어 Android아래쪽 탐색 표시 줄
됐어.잔말 말고 그만 받 아.내 가 오늘 실현 하고 싶 은 기능 중 하 나 는 바로 아래쪽 메뉴 표시 줄 을 올 라 갈 수 있 는 것 이다.왜 내 가 이런 물건 을 만 들 고 싶 었 을 까?아니면 1 년 전에 우리 app 이 이런 수 요 를 가지 고 있 었 기 때 문 일 까?그 당시 에 바 이 두 도 구 글 도 원 하 는 효 과 를 찾 지 못 했 고 사실은 간단 한 효 과 를 얻 었 다.하지만 그 때 는 저도 정말 너무 엉망 이 었 습 니 다.사용자 정의 에 관 한 모든 컨트롤 은 정말 할 줄 몰 랐 습 니 다.다른 사람의 코드 를 보 니 괜 찮 았 습 니 다.정말 제 가 쓰 면 갈 피 를 잡 을 수 없 었 습 니 다.내 가 써 봤 으 니까,정말 안 되 겠 어.그 때 는 자신 이 매우 폐기 적 이 라 고 생각 했 습 니 다.모든 효 과 는 다른 사람의 것 이 고 자신 도 쓸 줄 몰 랐 습 니 다.사용자 정의 컨트롤 도 잘 하기 로 했 고 미 루 고 미 루 면 지금 이다.한동안 사용자 정의 컨트롤 을 알 고 나 서 이 효과 가 생각 나 서 그 에 게 해 주 었 다.
효과 보기:
우선 이 컨트롤 은 미 끄 러 지 는 것 이 므 로 scrollto()나 scrollBy(),scroller 류 를 사용 할 것 입 니 다.그럼 이 세 가 지 를 간단히 소개 하 겠 습 니 다.
scrollto(int,int)와 scrollBy(int,int)
Scroller 는 손가락 이 미 끄 러 지 는 데 있어 서 비교적 중요 한 보조 클래스 로 개발 자가 매 끄 러 운 스크롤 을 완성 하 는 데 도움 을 줄 수 있 습 니 다.그 주요 내용 은:
startScroll(int startX, int startY, int dx, int dy)
과 startScroll(int startX, int - startY, int dx, int dy, int duration)
.
@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();
}
효과 가 이 루어 졌 군,하하.정말 간단 해.여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.