标签:android viewflow scrollview
在ScrollView中嵌套ViewFlow的时候,会出现事件拦截冲突的问题,经常出现:MotionEvent.ACTION_CANCEL事件,
原因就是ScrollVIew和ViewFlow嵌套使用了。这时,可以根据实际情况进行解决:
方案一:
如果ViewFlow中放置在最上面,而ScrollView在外面,是竖着滑动,那么可以在ViewFlow中的拦截事件中
public boolean onInterceptTouchEvent(MotionEvent ev) { }中直接return true;
这样做是因为:触摸事件到达此位置,说明你现在操作的地方在ViewFlow控件上面,然后直接在ViewFlow中的
public boolean onTouchEvent(MotionEvent ev) { } 方法中处理所有的事件即可。
为什么return true;后再在onTouchEvent中处理,这里是原理参考:Android onTouchEvent事件原理总结 在里面找一找
如果在其他地方滑动了,那就根本轮不到ViewFlow来处理事件,总感觉这样不是很好。
方案二:
自定义ScrollView,就是覆写以下ScrollView,然后再在布局文件中使用覆写好的MyScrollView即可。
参考代码如下:
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;
public class MyScrollView extends ScrollView {
private float xDistance, yDistance, xLast, yLast;
public MyScrollView(Context context) {
super(context);
}
public MyScrollView(Context context,AttributeSet attrs){
super(context, attrs);
}
public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
xDistance = yDistance = 0f;
xLast = ev.getX();
yLast = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
final float curX = ev.getX();
final float curY = ev.getY();
xDistance += Math.abs(curX - xLast);
yDistance += Math.abs(curY - yLast);
xLast = curX;
yLast = curY;
if (xDistance > yDistance) {
return false;
}
}
return super.onInterceptTouchEvent(ev);
}
}
自定义ViewFlow使用,ScrollView中嵌套ViewFlow滑动问题解决(---My 20150407)
标签:android viewflow scrollview
原文地址:http://blog.csdn.net/adayabetter/article/details/44920685