2 回答
![?](http://img1.sycdn.imooc.com/533e4c640001354402000200-100-100.jpg)
TA贡献1864条经验 获得超2个赞
我在嵌套ScrollView之前实现过,我认为子滚动视图总是消耗触摸,而父滚动视图永远不会听它们
这是 onInterceptTouchEvent控制视图是消耗触摸还是将其传递给其父级的方法的作用。
所以计划是计算滚动的方向,我是否到达了子 ScrollView 的滚动结束。
这段代码是 2 年前写的,所以如果有些东西被弃用了,请原谅。
public class CustomScrollView extends ScrollView {
private boolean bottomReached = false;
private boolean topReached = true;
private float startTouch = -1;
private float distance = -1;
public CustomScrollView(Context context) {
super(context);
}
public CustomScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
startTouch = ev.getY();
break;
case MotionEvent.ACTION_UP:
startTouch = -1;
break;
case MotionEvent.ACTION_MOVE:
distance = ev.getY() - startTouch;
if (Math.abs(distance) < 10) {
boolean onIntercept = super.onInterceptTouchEvent(ev);
return onIntercept;
} else {
if (!bottomReached && !topReached) {
return true;
} else {
if (distance > 0) {
// Scrolling Up
return bottomReached;
} else {
// Scrolling Down
return topReached;
}
}
}
}
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
startTouch = ev.getY();
break;
case MotionEvent.ACTION_UP:
startTouch = -1;
break;
case MotionEvent.ACTION_MOVE:
distance = ev.getY() - startTouch;
}
return super.onTouchEvent(ev);
}
}
添加回答
举报