Android-ScrollView上下滑动捕捉导致内部水平滑动的控件不灵敏(解决方案)
2014-07-17 19:03
417 查看
遇到这个问题,我们首先分析一下,当我们手指水平滑动时(并不一定是真正的水平,有可能在竖直方向也有位置变化),首先是最外部的ScrollView捕捉到滑动Event,如果其中包含了竖直滑动,那么它就不再抛出该信息,导致整个ScrollView的竖直滑动,而原本我们想要水平滑动的内部控件没有滑动。
为了解决这个问题,我们可以对滑动这个动作加以判断:如果滑动的水平距离大于竖直距离,那么认为它是水平滑动,否则认为它是竖直滑动。而这个判断该如何实现,在哪里实现?我们想,既然是ScrollView的错,那么我们可以自定义一个ScrollView来实现该解决方法。
代码如下,我们自定义MyScrollView:
public class MyScrollView extends ScrollView {
private float xDistance , yDistance , xLast , yLast;
public MyScrollView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
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);
}
}
重写onInterceptTouchEvent(MotionEvent ev)方法。为什么不是重写onTouchEvent呢,同学可以搜索一下。
为了解决这个问题,我们可以对滑动这个动作加以判断:如果滑动的水平距离大于竖直距离,那么认为它是水平滑动,否则认为它是竖直滑动。而这个判断该如何实现,在哪里实现?我们想,既然是ScrollView的错,那么我们可以自定义一个ScrollView来实现该解决方法。
代码如下,我们自定义MyScrollView:
public class MyScrollView extends ScrollView {
private float xDistance , yDistance , xLast , yLast;
public MyScrollView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
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);
}
}
重写onInterceptTouchEvent(MotionEvent ev)方法。为什么不是重写onTouchEvent呢,同学可以搜索一下。
相关文章推荐
- android scrollView 内嵌ViewPager或Gallery等水平滑动控件冲突问题解决实现同时滑动
- scrollview中包含viewpager导致viewpager左右滑动手势不灵敏的解决方案
- 使用ionic框架的<ion-scroll>进行水平滚动时,导致页面难以上下滑动的解决方案
- Android之解决scrollview总是优先滑动,导致在scrollview内的控件不滑动问题
- Android之解决scrollview总是优先滑动,导致在scrollview内的控件不滑动问题
- ScrollView和ViewPager嵌套使用(导致左右、上下滑动冲突解决方案)
- 从Android源码入手解决ScrollView与内部控件的滑动冲突问题
- android ScrollView的内部控件的fill_parent没有作用 解决
- android--解决方案--自定义tabhost(动态添加选项+带自动水平滑动选项卡+手势切换选项卡及内容功能)
- android 在一个scrollView里面嵌套一个需要滑动的控件(listView、gridView)
- android 关于listview scrollview 底部 控件无法显示的两个解决方案
- 可滑动控件(ListView,WebView,ScrollView)实现弹性滑动或者取消弹性滑动(上下或左右滑动)
- 解决ViewFlow在Scrollview下滑动不灵敏的BUG(解决viewflow与父控件的滑动事件冲突问题)
- Android -- ListView控件 去上下滑动阴影 选中背景黄色
- Android中实现上下左右都可滑动的ScrollView
- Android小知识——ScrollView内的内部嵌套LinearLayout布局导致滑动条占位置
- android中ScrollView嵌套滑动开关问题(上下滑动开关球挺在中间)
- [转]Android中实现上下左右都可滑动的ScrollView
- 【Android 开发】:UI控件之 ScrollView垂直滚动控件 和 HorizontalScrollView水平滚动控件的使用
- Android中实现上下左右都可滑动的ScrollView