美文网首页Android开发Android开发经验谈Android知识
Android CoordinatorLayout(五) 严重的

Android CoordinatorLayout(五) 严重的

作者: 键盘上的麒麟臂 | 来源:发表于2017-08-23 18:15 被阅读2848次

    这章来讲一个重大的问题,解决卡顿,我不敢保证我的方法是最优而且对所以都管用,但是至少会比之前的滑动顺畅。

    如果你用我Android CoordinatorLayout(三)中写的demo,你会发现一个问题,滑动会有卡顿,关键是,你如果一直用手指触碰屏幕滑动的话不会感觉什么。而卡顿是在产生惯性的时候。我们都知道现在的android滑动组件很牛逼,都有惯性的效果,你比如说RecyclerView,你滑动一定速度之后你放开手,它还会以减速的方式滑动一段距离。而这个demo不顺畅的地方就是在放开手之后的惯性上。别人也有遇到过这个问题:

    image.png

    那怎么办,我也不知道啊,我又看不懂源码,我也不知道怎么去解决这种卡顿,只能跟着大屌走了,去stackoverflow中看看大屌们都是怎么处理的。

    三、解决CoordinatorLayout滑动卡顿

    1. 大屌推荐之自定义Behavior 方法
    public final class FlingBehavior extends AppBarLayout.Behavior {
        private static final int TOP_CHILD_FLING_THRESHOLD = 3;
        private boolean isPositive;
    
        public FlingBehavior() {
        }
    
        public FlingBehavior(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        public boolean onNestedFling(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, float velocityX, float velocityY, boolean consumed) {
            if (velocityY > 0 && !isPositive || velocityY < 0 && isPositive) {
                velocityY = velocityY * -1;
            }
            if (target instanceof RecyclerView && velocityY < 0) {
                final RecyclerView recyclerView = (RecyclerView) target;
                final View firstChild = recyclerView.getChildAt(0);
                final int childAdapterPosition = recyclerView.getChildAdapterPosition(firstChild);
                consumed = childAdapterPosition > TOP_CHILD_FLING_THRESHOLD;
            }
            return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, consumed);
        }
    
        @Override
        public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed) {
            super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
            isPositive = dy > 0;
        }
    }
    
    <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            app:layout_behavior="com.example.kylinarm.coordinatorlayouttest.FlingBehavior"
            >
    

    你会发现这样做能解决卡顿,但是不是很好,为什么这样说呢?
    (1)我想到了一个很形象的句子来形容这样做的结果,在AppBarLayout加上这句话之后,RecyclerView滑动从原来的摩擦力很大(所以卡顿)变成了摩擦力超小(顺畅过头),什么是顺畅过头,你可以试一下,就像你嚼了炫迈一样,根本停不下来。
    (2)对NestedScrollView没有,在NestedScrollView的Fragment滑动时,还是会卡顿。

    2. 26版本已经解决这个BUG

    瞎扯淡,我升级到26还是不行,还是卡如狗。

    我找了很久,还是没能找到合适的方法解决 这个BUG,虽然有缺陷,但是第一个解决方法还是勉强能用,但是对NestedScrollView没有用,那就不用NestedScrollView吧,直接用recyclerView写一个Item然后用viewmodel也能实现NestedScrollView的效果。这样做下来唯一的不足就只剩我前面说的摩擦力太小了。还有一个问题是有时候会产生跳屏。

    兄弟们,我已经尽力了,我尝试了一个小时都没办法解决,onNestedFling内的代码我也不是很看得懂,所以没办法着手改造。我用过一些软件,里面的折叠效果是正常的,但是和CoordinatorLayout的效果有些不一样,所以我估计也许别人不是用CoordinatorLayout,或者如果有解决办法的请回复一下,谢谢。如果实在没有办法,我建议不要用这个控件,就算使用,那也要用在折叠范围很小,比如200dp内的viewgroup之类的,这样bug效果不是很明显,而像我之前的viewgroup高度占了屏幕的四分之三,这样bug太影响用户体验了。所以如果你折叠的布局高度很高,不建议在不解决这个BUG的情况下去使用这个控件。

    相关文章

      网友评论

        本文标题:Android CoordinatorLayout(五) 严重的

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