Android手势研究(textview及listview对比验证)
手势即手触摸屏幕做出动作。 View可以通过onTouchEvent收到触摸屏幕事件, 我们可以通过View.setOnTouchListener()设置事件监听器 或者override onTouchEvent()来拦截这些事件, 在拦截函数中判断触摸点的轨迹及运动速度就可以判断出是什么手势。 Android系统提供了GestureDetector来方便手势的判断,即:在拦截函数中每次touchevent都把事件作为参数调用GestureDetector.onTouchEvent(),当有手势被识别出后,就会通知调用者。 为了能通知到调用者,GestureDetector在构造时要求传入一个实现了OnGestureListener接口的对象, 通过此对象就可以接收到各种手势通知了。 首先先用textview来实验: 用一个ViewFlipper放置两个Textview,当手指在屏幕上左右移动时进行进行切换。 由于textview本身不会处理touchevent,而是会将其继续上传,所以textview布局时layout_width及layout_height没有影响。 如果touch事件发生在textview上会继续上传到viewflipper;如果发生在viewflipper上那么就直接处理。 所以我们应该拦截发生在ViewFlipper上的touchEvent,并进行处理。
代码如下,在onCreate中完成界面布局及事件拦截函数设置: Java代码 //创建一个ViewFlipper mVf = new ViewFlipper(this); //ViewFlipper打开长点击支持。如果不打开,无法收到长时间点击,那么手势判断就无从进行。 mVf.setLongClickable(true); //拦截ViewFlipper的touch事件,并使用GestureDetector.onTouchEvent来处理 mVf.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return mVfDetector.onTouchEvent(event); } }); //添加一个textview。textview不能setLongClickable(true), //如果设置了那么发生在textview上的touch事件就无法传给viewflipper, //无法被手势识别对象处理了。 TextView tv = new TextView(this); tv.setText("TextView 1"); tv.setBackgroundColor(0xffffffff); //设置一个白色背景,方便看到textview区域 mVf.addView(tv,new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); //再添加一个textview TextView tv2 = new TextView(this); tv2.setText("TextView 2"); tv2.setBackgroundColor(0xffffffff); mVf.addView(tv2,new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); //将viewFlipper作为Activity的主view显示 setContentView(mVf); |
---|
Java代码
//创建一个ViewFlipper
mVf = new ViewFlipper(this);
//ViewFlipper打开长点击支持。如果不打开,无法收到长时间点击,那么手势判断就无从进行。
mVf.setLongClickable(true);
//拦截ViewFlipper的touch事件,并使用GestureDetector.onTouchEvent来处理
mVf.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return mVfDetector.onTouchEvent(event);
}
});
//添加一个textview。textview不能setLongClickable(true),
//如果设置了那么发生在textview上的touch事件就无法传给viewflipper,
//无法被手势识别对象处理了。
TextView tv = new TextView(this);
tv.setText("TextView 1");
tv.setBackgroundColor(0xffffffff); //设置一个白色背景,方便看到textview区域
mVf.addView(tv,new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
//再添加一个textview
TextView tv2 = new TextView(this);
tv2.setText("TextView 2");
tv2.setBackgroundColor(0xffffffff);
mVf.addView(tv2,new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
//将viewFlipper作为Activity的主view显示
setContentView(mVf);
在监听器中用到了GestureDetector对象,其是一个类成员对象,用如下代码创建:
Java代码
private GestureDetector mVfDetector = new GestureDetector(new OnGestureListener() {
//手指在屏幕上移动距离小于此值不会被认为是手势
private static final int SWIPE_MIN_DISTANCE = 120;
//手指在屏幕上移动速度小于此值不会被认为手势
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
//手势识别函数,到此函数被系统回调时说明系统认为发生了手势事件,
//我们可以做进一步判定。
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
//如果第1个坐标点大于第二个坐标点,说明是向左滑动
//滑动距离以及滑动速度是额外判断,可根据实际情况修改。
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE &&
Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
//left
Log.i("GestureDemo", "ViewFlipper left");
mVf.showNext();
return true;
}else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE &&
Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
//right
Log.i("GestureDemo", "ViewFlipper right");
mVf.showPrevious();
return true;
}
return false;
}
... ...
... ...
});
}
- MySQL和Oracle的添加字段的处理差别 (r10笔记第73天)
- MySQL修改数据类型的问题总结(r10笔记第74天)
- 深究|Elasticsearch单字段支持的最大字符数?
- Go语言中Socket通信之Tcp客户端
- Oracle 12c PDB迁移及ORA-00600错误分析和解决(r10笔记第72天)
- 【Go 语言社区】epoll详解
- Oracle 12c数据库升级实战(r10笔记第70天)
- Oracle 12c升级检查问题分析(r10笔记第69天)
- 转--使用Revel(go)开发网站
- GoldenGate数据迁移的问题总结(二)(r10笔记第85天)
- Elasticsearch究竟要设置多少分片数?
- 设计模式(1)-使用简单工厂优化代码
- 简单易学的机器学习算法——因子分解机(Factorization Machine)
- Elasticsearch全文检索实战小结——复盘我带的第二个项目
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释