古人已用三冬足,年少今开万卷余。这篇文章主要讲述滑动冲突问题,触摸事件拦截处理相关的知识,希望能为你提供帮助。
最近遇到了几个关于滑动冲突的问题。问题的具体表现为:
- ScrollView里嵌套了一个垂直的ListView或者RecycleView会出现滑动卡顿的问题。问题的原因是ScrollView的滑动事件与子View(ListView或者RecycleView)的滑动发生了冲突。
解决的方法是写一个自定义ScrollView拦截子View的滑动事件。自定义ScrollView代码见下:
public class MyScrollView extends ScrollView
public MyScrollView(Context context)
super(context);
public MyScrollView(Context context, AttributeSet attrs)
super(context, attrs);
public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr)
super(context, attrs, defStyleAttr);
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
return true;
【滑动冲突问题,触摸事件拦截处理】
- 这种情况下的另一种问题是ListView的setSecletion()方法会被ScrollView屏蔽,导致ListView无法实现跳到指定Item。
- ScrollView里嵌套了一个水平的ListView或者RecycleView也会出现滑动卡顿或者划不动的问题。原因和1是一样的。
public class MyScrollView extends ScrollView
public MyScrollView(Context context)
super(context);
public MyScrollView(Context context, AttributeSet attrs)
super(context, attrs);
public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr)
super(context, attrs, defStyleAttr);
private int x, y;
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
switch (ev.getAction())
case MotionEvent.ACTION_DOWN://按下y
x = (int) ev.getX();
y = (int) ev.getY();
break;
case MotionEvent.ACTION_MOVE://移动
int new_x = (int) ev.getX();
int new_y = (int) ev.getY();
//判断有水平滑动的意向
int move_x = Math.abs(new_x - x); //x轴滑动的距离
int move_y = Math.abs(new_y - y); //y轴滑动的距离
if (move_x > (move_y + 10))//10的偏移量
return false; //传递给字View
////判断有上下滑动的意向(用于字VIew是上下,parent是水平的)
//int move_x = Math.abs(new_x - x); //x轴滑动的距离
//int move_y = Math.abs(new_y - y); //y轴滑动的距离
//if (move_y > (move_x + 10))//10的偏移量
//
//return false;
//
break;
return super.onInterceptTouchEvent(ev);
利用事件拦截可以解决很多Bug,也可以实现很酷炫的功能,如https://github.com/SingleShadowBlade/ScrollDemo.git
这是一个ListView的Item可以水平滑动,并且和titlebar同步滑动的效果,也可以斜着滑
推荐阅读
- EasyCVR启动失败并报错LibEasySnap.dll(The specified module could not be found)
- #yyds干货盘点#-设计模式分享-组合模式
- 重要的ui组件——Behavior
- gitlab 搭建go modules私有仓库
- Django+uwsgi在linux和windows上的部署
- Android 控件架构与自定义控件详解
- Android使用 SO 库时要注意的一些问题
- WordPress自定义程序在自定义程序界面中可完美运行,但在实际设计中却无法运行
- WordPress Customizr主题现代风格-子主题和覆盖模板