关于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)