Android CoordinatorLayout(五) 严重的卡顿BUG

简介: 这章来讲一个重大的问题,解决卡顿,我不敢保证我的方法是最优而且对所以都管用,但是至少会比之前的滑动顺畅。如果你用我Android CoordinatorLayout(三)中写的demo,你会发现一个问题,滑动会有卡顿,关键是,你如果一直用手指触碰屏幕滑动的话不会感觉什么。

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

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

img_7f93a8aa6c4cff4db09b3cfbf414ae7c.png
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的情况下去使用这个控件。

目录
相关文章
|
6月前
|
Java Android开发 UED
🧠Android多线程与异步编程实战!告别卡顿,让应用响应如丝般顺滑!🧵
【7月更文挑战第28天】在Android开发中,确保UI流畅性至关重要。多线程与异步编程技术可将耗时操作移至后台,避免阻塞主线程。我们通常采用`Thread`类、`Handler`与`Looper`、`AsyncTask`及`ExecutorService`等进行多线程编程。
64 2
|
8月前
|
Android开发
【Bug】Android resource linking failed和error: failed linking references.
【Bug】Android resource linking failed和error: failed linking references.
|
缓存 安全 开发工具
Android 解决bug:Android studio 运行、编译项目时导致电脑死机
Android 解决bug:Android studio 运行、编译项目时导致电脑死机
941 0
|
存储 监控 Android开发
Android卡顿优化 | ANR分析与实战(附ANR-WatchDog源码分析及实战、与AndroidPerformanceMonitor的区别)
Android卡顿优化 | ANR分析与实战(附ANR-WatchDog源码分析及实战、与AndroidPerformanceMonitor的区别)
|
7月前
|
XML 监控 安全
Android App性能优化之卡顿监控和卡顿优化
本文探讨了Android应用的卡顿优化,重点在于布局优化。建议包括将耗时操作移到后台、使用ViewPager2实现懒加载、减少布局嵌套并利用merge标签、使用ViewStub减少资源消耗,以及通过Layout Inspector和GPU过度绘制检测来优化。推荐使用AsyncLayoutInflater异步加载布局,但需注意线程安全和不支持特性。卡顿监控方面,提到了通过Looper、ChoreographerHelper、adb命令及第三方工具如systrace和BlockCanary。总结了Choreographer基于掉帧计算和BlockCanary基于Looper监控的原理。
121 3
|
8月前
|
存储 Android开发
Android 解决USB TP驱动中触摸卡顿和防抖动问题
Android 解决USB TP驱动中触摸卡顿和防抖动问题
221 1
|
存储 JSON 缓存
卡顿监测 · 方案篇 · Android卡顿监测指导原则(2)
卡顿监测 · 方案篇 · Android卡顿监测指导原则
181 0
卡顿监测 · 方案篇 · Android卡顿监测指导原则(2)
|
缓存 前端开发 Java
卡顿监测 · 方案篇 · Android卡顿监测指导原则
卡顿监测 · 方案篇 · Android卡顿监测指导原则
563 0
卡顿监测 · 方案篇 · Android卡顿监测指导原则
|
Android开发
Bug日志(四)——Android 防止多次点击(另解决多个列表子项点击)
在用户使用 应用的时候,经常会出现点击过快且多次点击同一控件的情况, 一方面这是因为应用或手机当前有些卡顿,网络卡啥的 另一方面也可能是由于很多应用并没有设置按钮点击时的 selector 或者其它按钮响应方式(例如点击按钮时按钮放大,常见于游戏),导致用户误认为没有点击到当前按钮。(比如使用selector再点击后更换背景颜色,图片等等)
|
XML Android开发 数据格式
Bug日志(二)-Android网路请求图片地址图片不显示
Bug日志(二)-Android网路请求图片地址图片不显示