标签: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