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; 

} 

... ... 

... ... 

}); 

} 

原文发布于微信公众号 - 非著名程序员(non-famous-coder)

原文发表时间:2014-12-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏androidBlog

自定义 Behavior - 仿新浪微博发现页的实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/de...

17520
来自专栏Android知识点总结

4-AI--Activity跳转动画

21520
来自专栏Android开发指南

3.复杂的viewpager

39690
来自专栏向治洪

BottomSheet底部动作条使用

底部动作条 底部动作条(Bottom Sheets)是一个从屏幕底部边缘向上滑出的一个面板,使用这种方式向用户呈现一组功能。底部动作条呈现了简单、清晰、无需额...

29480
来自专栏程序员的诗和远方

看代码学AndroidUI - Tab

最近慢慢学习一点安卓,先看了些基础的,还处于很初级的阶段,平常都是面对弱类型的语言,python,js,现在看java突然有点不适应。 这里推荐郭神的《第一行代...

34990
来自专栏Android知识点总结

2-VII-RecyclerView事件

10640
来自专栏肖蕾的博客

Android网络请求慢的时候,任意位置弹出加载中提示

15750
来自专栏Android中高级开发

Android开发之漫漫长途 XIV——ListView

该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索...

12830
来自专栏向治洪

achartengine之折线图

问题在文章的最后,大致说来就是折线图,如果点的个数大于3个的时候,不是所有的点都显示对应的值的,这是为什么呢,本来以为是小问题,但两天了还没找到原因) 将前...

294100
来自专栏分享达人秀

GridView属性和使用方法

前面一共用了8期来学习ListView列表的相关操作,其实学习的ListView的知识完全适用于AdapterView的其他子类,如GridView、S...

35370

扫码关注云+社区

领取腾讯云代金券