美文网首页
解决CoordinatorLayout+AppBarLayout

解决CoordinatorLayout+AppBarLayout

作者: Kyle_Xiong | 来源:发表于2019-03-21 12:42 被阅读0次

    最近发现项目中一个使用CoordinatorLayout+AppBarLayout的界面发生了滑动不顺畅的问题,界面中使用了CoordinatorLayout,AppBarLayout,CollapsingToolbarLayout,Toolbar,RecyclerView,当向上滑动AppBarLayout并在惯性滑动未停止的时候滑动RecyclerView发生回弹

    一、xml布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/behavior_demo_coordinatorLayout"
        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/ThemeOverlay.AppCompat.Dark.ActionBar"
            app:elevation="0dp"
            app:layout_behavior="com.example.utils.FlingBehavior">
    
            <android.support.design.widget.CollapsingToolbarLayout
                android:id="@+id/main.collapsing"
                android:layout_width="match_parent"
                android:layout_height="250dp"
                android:fitsSystemWindows="true"
                app:contentScrim="?attr/colorPrimary"
                app:expandedTitleMarginEnd="64dp"
                app:expandedTitleMarginStart="48dp"
                app:layout_scrollFlags="scroll|exitUntilCollapsed">
    
                <!--其他布局-->
                <ImageView
                    android:id="@+id/main.backdrop"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:fitsSystemWindows="true"
                    android:scaleType="centerCrop"
                    android:src="@drawable/img_bg"
                    app:layout_collapseMode="parallax" />
    
                <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    app:layout_collapseMode="pin"
                    app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
    
                    <RelativeLayout
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:paddingTop="15dp">
    
                        <ImageView
                            android:id="@+id/iv_back"
                            android:layout_width="wrap_content"
                            android:layout_height="match_parent"
                            android:paddingStart="15dp"
                            android:paddingEnd="15dp"
                            android:src="@drawable/ic_arrow_back_white_24dp" />
    
                        <ImageView
                            android:layout_width="wrap_content"
                            android:layout_height="match_parent"
                            android:layout_alignParentRight="true"
                            android:paddingStart="15dp"
                            android:paddingEnd="15dp"
                            android:src="@drawable/ic_apps_white_24dp" />
    
                    </RelativeLayout>
                </android.support.v7.widget.Toolbar>
            </android.support.design.widget.CollapsingToolbarLayout>
    
            <android.support.design.widget.TabLayout
                android:id="@+id/tabs"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:layout_alignParentBottom="true"
                android:background="?attr/colorPrimary"
                app:tabIndicatorColor="@color/colorAccent"
                app:tabIndicatorHeight="4dp"
                app:tabSelectedTextColor="#000"
                app:tabTextColor="#fff" />
        </android.support.design.widget.AppBarLayout>
    
        <android.support.v7.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
    
    </android.support.design.widget.CoordinatorLayout>
    
    

    app:layout_behavior="com.example.utils.FlingBehavior"这个是自定义的用来解决抖动问题

    二、解决办法

    自定义AppBarLayout.Behavior

    public class FlingBehavior extends AppBarLayout.Behavior {
        private static final int TOP_CHILD_FLING_THRESHOLD = 3;
        private boolean isPositive;
    
        public FlingBehavior() {
            super();
        }
    
        public FlingBehavior(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
    
    
        //fling上滑appbar然后迅速fling下滑recycler时, HeaderBehavior的mScroller并未停止, 会导致上下来回晃动
        @Override
        public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed, int type) {
            if (type == ViewCompat.TYPE_NON_TOUCH && getTopAndBottomOffset() == 0) { //recyclerview的惯性比较大 ,会顶在头部一会儿, 到头直接干掉它的滑动
                ViewCompat.stopNestedScroll(target, type);
            }
            super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);
        }
    
        @Override
        public boolean onInterceptTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent ev) {
            if (ev.getAction() == ACTION_DOWN) {
                Object scroller = getSuperSuperField(this, "mScroller");
                if (scroller != null && scroller instanceof OverScroller) {
                    OverScroller overScroller = (OverScroller) scroller;
                    overScroller.abortAnimation();
                }
            }
    
            return super.onInterceptTouchEvent(parent, child, ev);
        }
    
        private Object getSuperSuperField(Object paramClass, String paramString) {
            Field field = null;
            Object object = null;
            try {
                field = paramClass.getClass().getSuperclass().getSuperclass().getDeclaredField(paramString);
                field.setAccessible(true);
                object = field.get(paramClass);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return object;
        }
        // --------------------------- end
    }
    

    相关文章

      网友评论

          本文标题:解决CoordinatorLayout+AppBarLayout

          本文链接:https://www.haomeiwen.com/subject/makqvqtx.html