這章來講一個重大的問題帕膜,解決卡頓枣氧,我不敢保證我的方法是最優(yōu)而且對所以都管用,但是至少會比之前的滑動順暢垮刹。
如果你用我Android CoordinatorLayout(三)中寫的demo达吞,你會發(fā)現(xiàn)一個問題,滑動會有卡頓荒典,關(guān)鍵是酪劫,你如果一直用手指觸碰屏幕滑動的話不會感覺什么。而卡頓是在產(chǎn)生慣性的時候寺董。我們都知道現(xiàn)在的android滑動組件很牛逼覆糟,都有慣性的效果,你比如說RecyclerView螃征,你滑動一定速度之后你放開手搪桂,它還會以減速的方式滑動一段距離。而這個demo不順暢的地方就是在放開手之后的慣性上盯滚。別人也有遇到過這個問題:
那怎么辦踢械,我也不知道啊,我又看不懂源碼魄藕,我也不知道怎么去解決這種卡頓内列,只能跟著大屌走了,去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"
>
你會發(fā)現(xiàn)這樣做能解決卡頓,但是不是很好寝姿,為什么這樣說呢交排?
(1)我想到了一個很形象的句子來形容這樣做的結(jié)果,在AppBarLayout加上這句話之后饵筑,RecyclerView滑動從原來的摩擦力很大(所以卡頓)變成了摩擦力超邪Bā(順暢過頭),什么是順暢過頭根资,你可以試一下架专,就像你嚼了炫邁一樣同窘,根本停不下來。
(2)對NestedScrollView沒有部脚,在NestedScrollView的Fragment滑動時想邦,還是會卡頓。
2. 26版本已經(jīng)解決這個BUG
瞎扯淡委刘,我升級到26還是不行丧没,還是卡如狗。
我找了很久钱雷,還是沒能找到合適的方法解決 這個BUG骂铁,雖然有缺陷,但是第一個解決方法還是勉強能用罩抗,但是對NestedScrollView沒有用拉庵,那就不用NestedScrollView吧,直接用recyclerView寫一個Item然后用viewmodel也能實現(xiàn)NestedScrollView的效果套蒂。這樣做下來唯一的不足就只剩我前面說的摩擦力太小了钞支。還有一個問題是有時候會產(chǎn)生跳屏。