Material Design 시리즈 의 Behavior 위 에서 미끄러져 서 끝 단 추 를 표시 합 니 다.
원본 코드 는 문장의 끝 에 있다.
인용문
때때로 우리 의 페이지 내용 이 너무 길 때,페이지 밑 에 미 끄 러 진 사용자 가 다시 꼭대기 까지 미 끄 러 지 는 것 은 매우 번거롭다.안 드 로 이 드 는 iOS 가 status Bar 를 눌 러 서 꼭대기 로 돌아 갈 수 있 는 것 이 아니 라,일반적으로 Toolbar/ActionBar 를 두 번 누 르 거나 밑 에 단 추 를 놓 는 것 이다.
오늘 은 아래쪽 에 맨 위로 돌아 가 는 단 추 를 놓 습 니 다.그러면 우리 의 전통 적 인 방식 은 바로 이 슬라이딩 뷰 를 감청 하 는 것 이다.예 를 들 어 ScrollView/ListView/RecyclerView/GridView 등 이다.만약 에 우리 가 Coordinator Layout 를 사용한다 면 모든 것 이 매우 so easy 가 될 것 이다.
오늘 우 리 는 사용자 정의 Behavior 를 이용 하여 맨 위로 돌아 가 는 단추 의 점진 적 인 애니메이션 효 과 를 실현 합 니 다.만약 나의 Behavior 박문 에 관심 이 있다 면,관 리 는 문장 상단 에서 나의 Behavior 에 관 한 다른 박문 을 찾 을 수 있다.
사용자 정의 Bahavior 의 실현?
저 희 는 Coordinator Layout.Behavior 를 선택 한 후 ctrl+t 를 선택 한 후에 실현 류 가 많 습 니 다.어떤 것 을 선택 하 시 겠 습 니까?이것 은 우리 가 조작 해 야 할 버튼 이 누구 인지,도대체 시스템 이 이미 실현 한 기본 클래스 를 사용 할 수 있 는 지 를 봐 야 한다.그래서 다음 과 같은 질문 을 던 졌 습 니 다.
Behavior 계승 시스템 의 어떤 BaseBahavior 를 사용자 정의 합 니까?
이 문 제 는 사실 so easy 입 니 다.MD 를 접촉 한 사람 이 FAB 를 들 어 본 적 이 있 을 것 입 니 다.즉,우리 의 FloatingAction Button 입 니 다.그래서 우리 도 FloatingAction Button 을 사용 하기 때문에 우리 가 사용자 정의 한 Behavior 도 FloatingAction Button 을 기반 으로 합 니 다.
그래서 우 리 는 그 중에서 Coordinator Layout.Behavior 후 ctrl+t 에서 FloatingAction Button.Behavior 를 보 았 습 니 다.이 녀석 은 우리 가 계승 해 야 할 것 입 니 다.이 를 이용 하여 FloatingAction Button 의 표시 와 숨겨 진 애니메이션 을 제어 합 니 다.
Scale UpShowBehavior 의 실현
손가락 을 위로 미 끄 러 뜨리 고 아래 부분의 페이지 가 나타 나 버튼 을 표시 하기 때문에 우 리 는 잠시 그것 을 Scale UpShowBehavior 의 실현 이 라 고 부 릅 니 다.
다음 큰 코드 가 왔 습 니 다.우선 FloatingAction Button.Behavior 를 계승 해 야 합 니 다.
public class ScaleUpShowBehavior extends FloatingActionButton.Behavior {
public ScaleUpShowBehavior(Context context, AttributeSet attrs) {
super();
}
}
다음은 이 안의 중요 한 세 가지 방법 을 실현 한다.
// 。
onStartNestedScroll();
// 。
onNestedScroll();
// 。
onStopNestedScroll();
첫 번 째 방법 onStartNested Scroll:onStartNestedScroll(CoordinatorLayout l, FloatingActionButton c, View directTargetChild, View v, int nestedScrollAxes)
onStartNested Scroll 은 문자 그대로 입 니 다.스크롤 을 시작 할 때 호출 됩 니 다.그러면 이 방법 은 boolean 의 반환 값 이 있 습 니 다.Coordinator Layout 에 게 이 Behavior 가 감청 할 미끄럼 방향 을 알려 주 셔 야 합 니 다.우 리 는 위아래 로 미 끄 러 질 때 FAB 를 표시 하거나 숨 깁 니 다.그래서 여기 서 return nested Scrollaxes==ViewCompat.SCROLLAXIS_VERTICAL;。두 번 째 방법 onNested Scroll:
onNestedScroll(CoordinatorLayout l, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed)
응,네가 짐작 한 것 이 맞 아.이 방법 은 미끄럼 기간 에 호출 되 었 는데,바로 미 끄 러 지고 있 는 거 야.so,우 리 는 여기에서 view 의 애니메이션 을 제어 합 니 다.나의 테스트 를 통 해 규칙 을 발견 했다.
if (dyConsumed > 0 && dyUnconsumed == 0) {
System.out.println(" 。。。");
}
if (dyConsumed == 0 && dyUnconsumed > 0) {
System.out.println(" 。。。");
}
if (dyConsumed < 0 && dyUnconsumed == 0) {
System.out.println(" 。。。");
}
if (dyConsumed == 0 && dyUnconsumed < 0) {
System.out.println(" , 。。。");
}
따라서 우리 가 있 을 때 위 에서 미 끄 러 집 니 다.즉,사용자 가 페이지 의 아래 부분 을 볼 때 FAB 를 표시 해 야 합 니 다.
if (((dyConsumed > 0 && dyUnconsumed == 0) || (dyConsumed == 0 && dyUnconsumed > 0))
&& child.getVisibility() != View.VISIBLE) {//
AnimatorUtil.scaleShow(child, null);
}
반대로 사용자 의 손가락 이 내 려 가 페이지 의 윗부분 을 표시 할 때 FAB 를 숨 깁 니 다.
if (((dyConsumed < 0 && dyUnconsumed == 0) || (dyConsumed == 0 && dyUnconsumed < 0))
&& child.getVisibility() != View.GONE && !isAnimatingOut) {
AnimatorUtil.scaleHide(child, viewPropertyAnimatorListener);
}
그럼 여기 있 는 완전한 코드 는:
@Override
public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
// if (dyConsumed > 0 && dyUnconsumed == 0) {
// System.out.println(" 。。。");
// }
// if (dyConsumed == 0 && dyUnconsumed > 0) {
// System.out.println(" 。。。");
// }
// if (dyConsumed < 0 && dyUnconsumed == 0) {
// System.out.println(" 。。。");
// }
// if (dyConsumed == 0 && dyUnconsumed < 0) {
// System.out.println(" , 。。。");
// }
if (((dyConsumed > 0 && dyUnconsumed == 0) || (dyConsumed == 0
&& dyUnconsumed > 0)) && child.getVisibility() != View.VISIBLE) {//
AnimatorUtil.scaleShow(child, null);
} else if (((dyConsumed < 0 && dyUnconsumed == 0) || (dyConsumed == 0
&& dyUnconsumed < 0)) && child.getVisibility() != View.GONE && !isAnimatingOut) {
AnimatorUtil.scaleHide(child, viewPropertyAnimatorListener);
}
}
애니메이션 과 FAB 는 숨겨 진 실현 을 보 여 줍 니 다.눈치 빠 른 사람 은 분명히 보 았 을 것 이다.우리 위 에서 튀 어 나 온 몇 표 의 알 수 없 는 코드:
AnimatorUtil.scaleShow();
AnimatorUtil.scaleHide();
isAnimatingOut;
viewPropertyAnimatorListener;
이게 무슨 귀신 이지?Animator Util.scale Show()는 FAB 를 애니메이션 으로 보 여 줍 니 다.이것 은 시스템 이 아니 라 사용자 정의 입 니 다.
// view
public static void scaleShow(View view, ViewPropertyAnimatorListener viewPropertyAnimatorListener) {
view.setVisibility(View.VISIBLE);
ViewCompat.animate(view)
.scaleX(1.0f)
.scaleY(1.0f)
.alpha(1.0f)
.setDuration(800)
.setListener(viewPropertyAnimatorListener)
.setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR)
.start();
}
AnimatorUtil.scaleHide()는 FAB 를 점점 숨 기 는 데 사 용 됩 니 다.물론 우리 가 사용자 정의 애니메이션 이기 도 합 니 다.
// view
public static void scaleHide(View view, ViewPropertyAnimatorListener viewPropertyAnimatorListener) {
ViewCompat.animate(view)
.scaleX(0.0f)
.scaleY(0.0f)
.alpha(0.0f)
.setDuration(800)
.setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR)
.setListener(viewPropertyAnimatorListener)
.start();
}
view Property Animator Listener 와 isAnimating Out 은 숨겨 진 애니메이션 의 실행 을 감청 하 는 데 사 용 됩 니 다.애니메이션 이 실 행 된 후에 야 view.set Visibility(View.GONE);자,이게 방법 이 군.하하:
private boolean isAnimatingOut = false;
ViewPropertyAnimatorListener viewPropertyAnimatorListener = new ViewPropertyAnimatorListener() {
@Override
public void onAnimationStart(View view) {
isAnimatingOut = true;
}
@Override
public void onAnimationEnd(View view) {
isAnimatingOut = false;
view.setVisibility(View.GONE);
}
@Override
public void onAnimationCancel(View arg0) {
isAnimatingOut = false;
}
};
Scale UpShowBehavior 사용우선 우 리 는 시스템 처럼 String.xml 에서 값 을 정의 합 니 다.
com.yanzhenjie.definebehavior.behavior.ScaleUpShowBehavior
그리고 xml 레이아웃 에서 사용:
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
...
app:layout_behavior="@string/scale_up_show_behavior" />
물론 당신 도 xml 레이아웃 에 이러한 종류의 전체 이름 을 직접 쓰 지만 이런 식 으로 하면 나중에 이런 종류의 가방 을 수정 하 는 데 불리 합 니 다.app:layout_behavior="com.yanzhenjie.definebehavior.behavior.ScaleUpShowBehavior"
자,잔 소 리 를 다 했 습 니 다.이 레이아웃 의 전체 코드 를 훑 어보 세 요.
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="16dp"
android:src="@mipmap/abc_ic_ab_back_top"
app:layout_behavior="@string/scale_up_show_behavior"
app:layout_scrollFlags="scroll|enterAlways|snap" />
</android.support.design.widget.CoordinatorLayout>
그리고 RecyclerView 에 아무 데 이 터 를 주 고 뛰 어 다 녀 보 세 요.하하,완벽 하지 않 나 요?참,어떤 친구 들 은 activity 가 실행 되 자마자 이 FAB 를 보 았 기 때문에 우 리 는 onWindow FocusChanged()에 숨겨 야 합 니 다.
private boolean isInitializeFAB = false;
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (!isInitializeFAB) {
isInitializeFAB = true;
hideFAB();
}
}
private void hideFAB() {
FAB.postDelayed(new Runnable() {
@Override
public void run() {
AnimatorUtil.scaleHide(FAB, new ViewPropertyAnimatorListener() {
@Override
public void onAnimationStart(View view) {
}
@Override
public void onAnimationEnd(View view) {
FAB.setVisibility(View.GONE);
}
@Override
public void onAnimationCancel(View view) {
}
});
}
}, 500);
}
완벽 해!원본 다운로드:http://xiazai.jb51.net/201609/yuanma/AndroidBehavior(jb51.net).rar
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【IE 대응】Google Material Icons를 data 속성을 사용해 스마트하게 표시한다방법 1: HTML로 직접 작성 가장 쉬운 방법이지만 문제가 하나 있습니다. 구글의 검색 결과에 표시되는 타이틀이나 메뉴 부분에 이 방법으로 아이콘을 설치해 버리면, emailお問い合わせフォーム 와 같은 형태로 아이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.