Android4.2 scrollview 手势bug

http://www.eoeandroid.com/thread-258045-1-1.html

测试用机Nexus7,android版本4.2.2

当scrollview中放入的children(也可以是child的children)上设有click和longclick事件的时候,滑动无效
当手放在child以外的属于scrollview的空白地方滑动,滑动有效,并且之后在children上面滑动也有效。

猜测:一开始child的事件处理将事件拦截了,或者说外层容器,但是之后在scrollview上面滑动时激活了
我都语无伦次了。。。。

测试用例可以用DodoWaterFall的瀑布流,

1. scrollview中加入几个child, scrollview.width=match_parent. child.layout_margin=30
2. child.setOnClickListener 或 child.setOnLongClickListener 
3. 先用手指按住child滑动:无效
4. 手指按住scrollview边框空白处滑动:成功

5. 成功之后,手指再放到child上滑动:成功


简单总结一下, 操作中的事件拦截什么的流程完全正确,问题不在这里
当scrollview初始化在顶部或滚动到顶部的时候, 滑动无效
所以我讲每次加载后或滑动到顶部后 scrollTo(0, 1)问题解决了

----------forlong401--------------

子view的click和longclick和向下滚动冲突,二者只能有一个起作用。

4.2系统中,scrollview的onInterceptTouchEvent方法中,有一个判断:

        /*
         * Don't try to intercept touch if we can't scroll anyway.
         */
        if (getScrollY() == 0 && !canScrollVertically(1)) {
            return false;
        }


所以要逃过这个判断就需要将Y坐标挪一下,或者后面的判断canScrollVertically为true。后面的这个判断可以通过下面的方式搞定:

    /**
     * Check if this view can be scrolled vertically in a certain direction.
     *
     * @param direction Negative to check scrolling up, positive to check scrolling down.
     * @return true if this view can be scrolled in the specified direction, false otherwise.
     */
    public boolean canScrollVertically(int direction) {
        final int offset = computeVerticalScrollOffset();
        final int range = computeVerticalScrollRange() - computeVerticalScrollExtent();
        if (range == 0) return false;
        if (direction < 0) {
            return offset > 0;
        } else {
            return offset < range - 1;
        }
    }



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值