关于ScrollView的若干问题,比如嵌套view然后失去惯性

2017-06-26  本文已影响113人  minminaya

目录

1.scrollView嵌套RecyclerView失去惯性滑动

2.关于起始位置不是scrollview顶部


一 scrollView嵌套RecyclerView失去惯性滑动

出现这种问题只要把滑动事件屏蔽就可以了


public class MyScrollview extends ScrollView {
    private int downX;
    private int downY;
    private int mTouchSlop;



    public MyScrollview(Context context) {
        super(context);
        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    }

    public MyScrollview(Context context, AttributeSet attrs) {
        super(context, attrs);
        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    }

    public MyScrollview(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent e) {
        int action = e.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                downX = (int) e.getRawX();
                downY = (int) e.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                int moveY = (int) e.getRawY();
                if (Math.abs(moveY - downY) > mTouchSlop) {
                  //如果有滑动了,则屏蔽滑动事件
                    return true;
                }
        }
        return super.onInterceptTouchEvent(e);
    }
}

TouchSlop是处理触摸事件中的一个常量,被系统认为滑动和点击事件的临界点。
理解这个touchSlop是一个滑动距离值的常量,也就是说当我们手触摸在屏幕上滑动时,如果滑动距离没有超过touchSlop值的话 ,android系统本身是不会认为我们在屏幕上做了手势滑动,因此只有当我们在屏幕上的滑动距离超过touchSlop值时,android系统本身才 会认为我们做了滑动操作并去响应触摸事件,不过要注意的是不同的设备,touchSlop的值可能是不同的,一切以函数获取为准。

最后将布局文件中的xml引用改为MyScrollview 即可


二 关于起始位置不是scrollview顶部

这是因为内部也许有gridview,listview,Recycleview等,他们默认获取了焦点,你只要把焦点去掉,比如Recycleview,在code中

mRecycleview.setFocusable(false);

当然你可以使用scrollview的方法,

mScrolleView.smoothScrollTo(x, y)
上一篇下一篇

猜你喜欢

热点阅读