[Material Design] 사용자 정의 Floating Action Button 슬라이딩 행위는 발생하지 않는 문제만 숨깁니다

7651 단어 MaterialDesign
먼저 Behavior 코드를 알려드릴게요. 인터넷에서 Floating Action Button(이하 FAB)의 미끄럼에 관한 코드가 많으니 참고하세요.
public class FabBehavior extends FloatingActionButton.Behavior{
    private static final Interpolator INTERPOLATOR = new FastOutSlowInInterpolator();
    private boolean mIsAnimatingOut = false;

    public FabBehavior(Context context, AttributeSet attrs) {
        super();
    }

    @Override
    public boolean onStartNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child,
                                       final View directTargetChild, final View target, final int nestedScrollAxes) {
        // Ensure we react to vertical scrolling
        return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL
                || super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);
    }

    @Override
    public void onNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child,
                               final View target, final int dxConsumed, final int dyConsumed,
                               final int dxUnconsumed, final int dyUnconsumed) {
        super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);
        if (dyConsumed > 0 && !this.mIsAnimatingOut && child.getVisibility() == View.VISIBLE) {
            // User scrolled down and the FAB is currently visible -> hide the FAB
            animateOut(child);
        } else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) {
            // User scrolled up and the FAB is currently not visible -> show the FAB
            animateIn(child);
        }
    }

    // Same animation that FloatingActionButton.Behavior uses to hide the FAB when the AppBarLayout exits
    private void animateOut(final FloatingActionButton button) {
        if (Build.VERSION.SDK_INT >= 14) {
            ViewCompat.animate(button).translationY(button.getHeight() + getMarginBottom(button)).setInterpolator(INTERPOLATOR).withLayer()
                    .setListener(new ViewPropertyAnimatorListener() {
                        public void onAnimationStart(View view) {
                            FabBehavior.this.mIsAnimatingOut = true;
                        }

                        public void onAnimationCancel(View view) {
                            FabBehavior.this.mIsAnimatingOut = false;
                        }

                        public void onAnimationEnd(View view) {
                            FabBehavior.this.mIsAnimatingOut = false;
                            view.setVisibility(View.GONE);
                        }
                    }).start();
        } else {

        }
    }

    // Same animation that FloatingActionButton.Behavior uses to show the FAB when the AppBarLayout enters
    private void animateIn(FloatingActionButton button) {
        button.setVisibility(View.VISIBLE);
        if (Build.VERSION.SDK_INT >= 14) {
            ViewCompat.animate(button).translationY(0)
                    .setInterpolator(INTERPOLATOR).withLayer().setListener(null)
                    .start();
        } else {

        }
    }

    private int getMarginBottom(View v) {
        int marginBottom = 0;
        final ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
        if (layoutParams instanceof ViewGroup.MarginLayoutParams) {
            marginBottom = ((ViewGroup.MarginLayoutParams) layoutParams).bottomMargin;
        }
        return marginBottom;
    }
}

이것은 사용자 정의 Behavior 클래스입니다. 주로 onNested Scroll에서 나타나고 사라지는 애니메이션을 사용자 정의합니다.사용할 때 xml 파일에 FAB에 전체 behavior 클래스 이름을 포함하는layoutbehavior 속성
app:layout_behavior="com.normalframe.widgets.view.FabBehavior"

이렇게 하면 FAB는 리스트에서 미끄러지면서 사라지고 미끄러져 나온다.이 기능은 주로 FAB의 위치가 목록의 마지막 항목을 가리는 문제를 처리하고 슬라이딩할 때 FAB가 숨기면 목록의 밑에 있는 마지막 항목에 도달할 때 방금 한 동작이 슬라이딩 동작이기 때문에 FAB가 숨겨진 상태여서 목록에 가려지지 않는다.
이 기능을 쓸 때 문제가 하나 발견되었다. 미끄러질 때 FAB는 정상적으로 숨길 수 있지만 목록을 내리면 FAB가 나타나지 않는다는 것이다.같은 코드를 다른 항목에 넣으면 일부는 정상적으로 기능을 실현할 수 있다.Debug에서 위로 당길 때 onNested Scroll을 호출합니다. 따라서 사용자 정의 숨김 방법은 호출될 수 있지만, 아래로 내려갈 때 onNested Scroll을 호출하지 않습니다.
마지막으로 SDK 버전의 문제인 것을 발견했습니다. 25(7.1.1.1)를 사용할 때 이 문제가 있을 수 있습니다. 24로 바꾸면 문제가 없습니다.당분간은 원인을 모르니 연구를 기다려야 한다.

좋은 웹페이지 즐겨찾기