2017-09-09 19:19:27

Android N: 修复7.1.1下NestedScrollView滑动失灵的问题

文章目录

安卓7.1.1下,NestedScrollView有一个滑动失灵的bug,具体动图可以戳安卓开发团队成员的这篇博文

细节

上面的文章说清楚了这是NestedScrollView本身的问题,只需要将design-support-library升级到26.0.0-beta2及以上。写这篇文章时,26.0.0正式版已经出来了。

然而令人遗憾的是,博主写的App使用到的库的版本十分分散,升级失败了,只能用博文中另外一种办法,检查滑动是否结束。

// https://github.com/smallpath/psnine-patcher/blob/master/react-native-nested-scrollview/android/src/main/java/com/mohtada/nestedscrollview/ReactNestedScrollView.java#L194

    @Override 
    protected void onDraw(Canvas canvas) { 
        super.onDraw(canvas); 

        try { 
            Field mScroller = NestedScrollView.class.getDeclaredField("mScroller"); 
            mScroller.setAccessible(true); 

            Method isFinishedMethod = ScrollerCompat.class.getDeclaredMethod("isFinished"); 
            boolean isFinished = (boolean) isFinishedMethod.invoke(mScroller.get(this)); 

            if (!isFinished) { 
                ViewCompat.postInvalidateOnAnimation(this); 
            } 
        } catch (Exception e) { 
            // No need for actions 
        } 
    }

这里其实可以用到RN的注解,指明此方法只在安卓N及以上运行。

其他

Java中的ScrollView有个方法剥夺了RN的手势权限:

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (!mScrollEnabled) {
            return false;
        }

        if (super.onInterceptTouchEvent(ev)) {
            NativeGestureUtil.notifyNativeGestureStarted(this, ev);  // 这一句
            ReactNestedScrollViewHelper.emitScrollBeginDragEvent(this);
            mDragging = true;
            enableFpsListener();
            return true;
        }

        return false;
    }

在RN的0.33版本中,博主曾经仅用RN的手势系统,并借助去除上面那一句代码来实现了一个JS层面版的AppbarLayout(即安卓中常见的吸顶效果),然而后期升级到0.38之后,注释的这一句导致滑动结束手指离开屏幕的位置又被触发了一次点击事件,导致博主只能换成AppbarLayout的RN封装库,踩坑无数。其中最奇葩的坑是这样的:标题和图标的颜色必须完全相同,否则AppbarLayout吸顶效果会失效。博主至今不知这个现象是什么样的代码实现的

本文链接:https://smallpath.me/post/android-7.1-nested-scrollview-fling

-- EOF --