前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android手势研究(textview及listview对比验证)

Android手势研究(textview及listview对比验证)

作者头像
非著名程序员
发布2018-02-01 16:01:10
6490
发布2018-02-01 16:01:10
举报
文章被收录于专栏:非著名程序员非著名程序员

手势即手触摸屏幕做出动作。 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);

代码语言:js
复制

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);

代码语言:js
复制
在监听器中用到了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; 

} 

... ... 

... ... 

}); 

} 
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2014-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 非著名程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档