`

【转】Android手势研究(textview及listview对比验证)(一)

阅读更多

原文地址:http://mypyg.iteye.com/blog/761331

 

手势即手触摸屏幕做出动作。

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代码 复制代码 收藏代码
  1. //创建一个ViewFlipper   
  2.         mVf = new ViewFlipper(this);   
  3.         //ViewFlipper打开长点击支持。如果不打开,无法收到长时间点击,那么手势判断就无从进行。   
  4.         mVf.setLongClickable(true);   
  5.         //拦截ViewFlipper的touch事件,并使用GestureDetector.onTouchEvent来处理   
  6.         mVf.setOnTouchListener(new OnTouchListener() {             
  7.             @Override  
  8.             public boolean onTouch(View v, MotionEvent event) {   
  9.                 return mVfDetector.onTouchEvent(event);   
  10.             }   
  11.         });   
  12.            
  13.         //添加一个textview。textview不能setLongClickable(true),   
  14.         //如果设置了那么发生在textview上的touch事件就无法传给viewflipper,   
  15.         //无法被手势识别对象处理了。   
  16.         TextView tv = new TextView(this);   
  17.         tv.setText("TextView 1");   
  18.         tv.setBackgroundColor(0xffffffff); //设置一个白色背景,方便看到textview区域   
  19.         mVf.addView(tv,new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));   
  20.            
  21.         //再添加一个textview   
  22.         TextView tv2 = new TextView(this);   
  23.         tv2.setText("TextView 2");   
  24.         tv2.setBackgroundColor(0xffffffff);   
  25.         mVf.addView(tv2,new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));   
  26.                   
  27.         //将viewFlipper作为Activity的主view显示   
  28.         setContentView(mVf);  
//创建一个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代码 复制代码 收藏代码
  1. private GestureDetector mVfDetector = new GestureDetector(new OnGestureListener() {   
  2.         //手指在屏幕上移动距离小于此值不会被认为是手势   
  3.         private static final int SWIPE_MIN_DISTANCE = 120;   
  4.         //手指在屏幕上移动速度小于此值不会被认为手势   
  5.         private static final int SWIPE_THRESHOLD_VELOCITY = 200;   
  6.            
  7.         //手势识别函数,到此函数被系统回调时说明系统认为发生了手势事件,   
  8.         //我们可以做进一步判定。   
  9.         @Override  
  10.         public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {   
  11.             //如果第1个坐标点大于第二个坐标点,说明是向左滑动   
  12.             //滑动距离以及滑动速度是额外判断,可根据实际情况修改。   
  13.             if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE &&    
  14. Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {   
  15.                 //left   
  16.                 Log.i("GestureDemo""ViewFlipper left");   
  17.                 mVf.showNext();   
  18.                 return true;   
  19.             }else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE &&    
  20. Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {   
  21.                 //right   
  22.                 Log.i("GestureDemo""ViewFlipper right");   
  23.                 mVf.showPrevious();    
  24.                 return true;   
  25.             }   
  26.             return false;   
  27.         }   
  28.                 ... ...   
  29.                 ... ...   
  30.          });   
  31. }  

源码:

分享到:
评论

相关推荐

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

    这篇博客“Android手势研究(textview及listview对比验证)(一)”探讨了如何在TextView和ListView中实现和比较手势识别功能。 首先,TextView是Android中用于显示单行或多行文本的基本组件,而ListView则是展示可...

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

    总结来说,Android手势研究是提高应用交互体验的关键,理解和熟练运用手势检测机制对于开发者至关重要。通过对比TextView和ListView的手势处理,我们可以更好地设计和实现用户友好的界面交互,同时借助Android提供的...

    基于Android的图书管理系统源代码

    【基于Android的图书管理系统源代码】是一个专门为Android平台设计的应用程序,用于管理和操作图书相关数据。这个系统提供了用户注册、登录以及图书信息管理的核心功能,是开发者学习Android应用开发、数据库管理和...

    android 阅读器源码

    【Android阅读器源码解析】 在移动设备上,阅读电子书籍已经成为现代生活的一部分...通过深入研究源码,开发者不仅可以理解Android应用的基本架构,还能学习到文件操作、UI设计、数据存储和性能优化等多个方面的知识。

    移动开心网 Android手机版源代码

    移动开心网Android手机版源代码是针对想要学习或深入理解Android应用程序开发,特别是社交网络服务(SNS)应用的开发者的一份宝贵资源。这份源代码涵盖了移动应用开发的基础和特定功能,如用户登录、内容展示、互动...

    Android的Activity众多控件效果

    以上只是Android Activity中控件效果的一部分,实际开发中还有更多高级用法和组合技巧,如触摸事件处理、手势识别、自定义控件等。熟练掌握这些控件及其效果,能够帮助开发者创建出丰富多样的用户界面,提升应用的...

    androidUI界面开发

    2. **控件(Widgets)**:Android提供了一系列预定义的控件,如Button、EditText、TextView、ImageView等,用于构建交互式界面。理解这些控件的属性和用法是UI设计的基础。 3. **主题和样式(Themes & Styles)**:...

    android从入门到精通sl(实例源程序)

    #### 一、Android基础知识 1. **Android系统简介** - Android是一个基于Linux内核的开源移动操作系统,由Google公司维护。 - 它支持多种设备,包括智能手机、平板电脑、可穿戴设备等。 - Android拥有庞大的...

    自己平时做的android相关的总结

    2. **数字签名**:在Android应用发布时,数字签名用于验证应用的完整性和开发者身份,确保应用未经篡改,并允许系统安装和更新应用。 3. **JNI (Java Native Interface)**:允许Java代码调用C/C++原生代码,用于...

    高仿微信界面app

    此外,还需掌握Android布局文件XML的编写,如LinearLayout、RelativeLayout、ConstraintLayout等布局管理器,以及ImageView、TextView、Button等基本UI控件的使用。 2. UI设计与模仿:高仿微信界面意味着要对微信的...

    完美登录界面设计,附加登录下拉效果.zip

    2. **下拉效果**:在Android中,下拉效果常常通过SwipeRefreshLayout实现,这是一个允许用户通过下拉手势刷新内容的组件。当用户下拉时,它会展示一个刷新指示器,提供视觉反馈。配合ListView或RecyclerView,用户在...

    模仿格瓦拉的效果图

    在Android开发领域,模仿知名应用的设计和功能是提升开发者技能的有效途径之一。在这个案例中,我们关注的是"模仿格瓦拉的效果图",这显然指的是一个Android应用项目,旨在实现与电影票务应用“格瓦拉”类似的用户...

    安卓课程表包含服务器端

    开发者需要熟悉安卓的UI设计,如使用XML布局文件创建界面,以及各种控件的使用,如TextView、Button、ListView等。此外,还需掌握Activity和Fragment的生命周期管理,以及Intent用于不同组件间的通信。 2. **课程表...

    安卓常用控件例子集合

    "安卓常用控件例子集合"是一个专为初学者设计的项目,它整合了Android SDK中常见的UI控件,并提供了示例代码,帮助开发者快速理解和应用这些控件。 1. **TextView**:TextView是显示文本的基本控件,可以用来显示...

    UIDemos:Andorid的简单用户界面演示

    《Android UI组件演示——UIDemos详解》 ...通过深入研究这个项目,开发者能够更好地掌握Android UI设计的精髓,创造出更加直观、易用的应用。无论是初学者还是经验丰富的开发者,都可以从中受益匪浅。

Global site tag (gtag.js) - Google Analytics