链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/05/2381025.html

一、概述

GestureDetector是一个用于识别手势的类,这里所讲的手势识别,不是模式识别里所讲的手势(用户的手在用摄像头前做的动作)识别,而是说用户的手在触摸屏上做的手势(比如滑动等),它可以识别一般的手势,也可以识别用户自定义的手势。

二、要求

利用GestureDetector、ViewFlipper类实现两个View之间的切换。

三、实现

新建工程MyGesture,修改/res/layout/main.xml文件,在里面添加一个ViewFlipper,完整的main.xml文件如下:

 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical" >
6
7 <ViewFlipper
8 android:id="@+id/viewflipper"
9 android:layout_width="fill_parent"
10 android:layout_height="fill_parent"
11 >
12
13 </ViewFlipper>
14
15 </LinearLayout>

接着,在/res/layout下添加2个布局文件:firstview.xml和secondview.xml,它们的内容都是一个TextView和一个ImageView,firstview.xml如下:

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 android:layout_width="fill_parent"
3 android:layout_height="fill_parent"
4 android:orientation="vertical" >
5
6 <TextView
7 android:layout_width="fill_parent"
8 android:layout_height="wrap_content"
9 android:text="这是第一个View"
10 android:textColor="#FFFF0000"
11 android:gravity="center_horizontal"
12 android:textSize="20dip"
13 />
14
15
16 <ImageView
17 android:id="@+id/fimg"
18 android:layout_width="fill_parent"
19 android:layout_height="wrap_content"
20 android:src="@drawable/sir"
21 />
22
23
24 </LinearLayout>

secondview.xml内容如下:

 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical" >
6
7 <TextView
8 android:layout_width="fill_parent"
9 android:layout_height="wrap_content"
10 android:text="这是第二个View"
11 android:textColor="#FF0000FF"
12 android:gravity="center_horizontal"
13 android:textSize="20dip"
14 />
15
16 <ImageView
17 android:id="@+id/fimg"
18 android:layout_width="fill_parent"
19 android:layout_height="wrap_content"
20 android:src="@drawable/android"
21 />
22
23
24 </LinearLayout>

最后,修改MyGestureActivity.java文件,主要定义一个GestureDetectorListener类用于实现GestureDetector.OnGestureListener接口,完整的内容如下:

  1 package com.nan.gesture;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import android.view.GestureDetector;
6 import android.view.LayoutInflater;
7 import android.view.MotionEvent;
8 import android.view.View;
9 import android.widget.ViewFlipper;
10
11
12
13 public class MyGestureActivity extends Activity
14 {
15 //滑动距离的差值
16 private static final int DISTANCE = 40;
17
18 private ViewFlipper mViewFlipper = null;
19 private LayoutInflater mLayoutInflater = null;
20 private GestureDetector mGestureDetector = null;
21
22 /** Called when the activity is first created. */
23 @Override
24 public void onCreate(Bundle savedInstanceState)
25 {
26 super.onCreate(savedInstanceState);
27 setContentView(R.layout.main);
28
29 mViewFlipper = (ViewFlipper)this.findViewById(R.id.viewflipper);
30 mLayoutInflater = LayoutInflater.from(MyGestureActivity.this);
31 mGestureDetector = new GestureDetector(this,new GestureDetectorListener());
32
33 //将布局文件firstview.xml变为View对象
34 View firstView = mLayoutInflater.inflate(R.layout.firstview, null);
35 //将布局文件secondview.xml变为View对象
36 View secondView = mLayoutInflater.inflate(R.layout.secondview, null);
37 //添加View
38 mViewFlipper.addView(firstView);
39 //添加View
40 mViewFlipper.addView(secondView);
41
42 }
43
44 @Override
45 public boolean onTouchEvent(MotionEvent event)
46 {
47 //将触摸事件交给GestureDetector来处理
48 return mGestureDetector.onTouchEvent(event);
49 }
50
51
52 public class GestureDetectorListener implements GestureDetector.OnGestureListener
53 {
54 @Override
55 public boolean onDown(MotionEvent e)
56 {
57 // TODO Auto-generated method stub
58
59
60 return false;
61 }
62
63 @Override
64 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
65 float velocityY)
66 {
67 // TODO Auto-generated method stub
68
69 if((e1.getX()-e2.getX())>DISTANCE)
70 {
71 //显示下一个view
72 mViewFlipper.showNext();
73 return true;
74 }
75 else if((e2.getX()-e1.getX())>DISTANCE)
76 {
77 //显示前一个view
78 mViewFlipper.showPrevious();
79 return true;
80 }
81 return false;
82 }
83
84 @Override
85 public void onLongPress(MotionEvent e)
86 {
87 // TODO Auto-generated method stub
88
89 }
90
91 @Override
92 public boolean onScroll(MotionEvent e1, MotionEvent e2,
93 float distanceX, float distanceY)
94 {
95 // TODO Auto-generated method stub
96 return false;
97 }
98
99 @Override
100 public void onShowPress(MotionEvent e)
101 {
102 // TODO Auto-generated method stub
103
104 }
105
106 @Override
107 public boolean onSingleTapUp(MotionEvent e)
108 {
109 // TODO Auto-generated method stub
110 return false;
111 }
112
113 }
114
115 }

好了,运行该程序:

用手在屏幕上左右滑动试下:

OK了。

这里view之间的切换并没有加上动画效果,如果加上动画的话就可以做出翻页的效果。

Android应用开发基础篇(13)-----GestureDetector(手势识别)的更多相关文章

  1. Android应用开发基础篇(1)-----Button

    Android应用开发基础篇(1)-----Button   一.概述        Button,顾名思义就是按钮的意思,它主要的功能是响应用户按下按钮时的动作. 二.应用      新建一个工程, ...

  2. Android应用开发基础篇(3)-----ListView

    一.概述 ListView是一个列表显示控件,它的应用非常广泛,在很多应用程序中都可以看到它的身影,比如来电通,网易新闻等等,特别是QQ.因此非常有必要熟练掌握它. 二.要求 能够利用ListView ...

  3. Android应用开发基础篇(4)-----TabHost(选项卡)

    一.概述 TabHost是一种用来显示标签的组件,不清楚?看一下来电通这个应用就知道了.这个组件用起来与其他组件不太一样,它需要继承TabActivity这个类,还有它的布局文件与我们平时用的也有些不 ...

  4. Android应用开发基础篇(11)-----ViewFlipper

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/01/2376067.html 一.概述 ViewFlipper这个部件是用来实现多页显示的,多页 ...

  5. Android应用开发基础篇(2)-----Notification(状态栏通知)

    一.概述      Notification这个部件的功能是在状态栏里显示消息提醒,比如有未读的短信或者是未接的电话,那么状态栏里都会有显示,更或者是从某个应用(比如QQ,酷我音乐等等)里按Home键 ...

  6. Android应用开发基础篇(16)-----ScaleGestureDetector(缩放手势检测)

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/11/2390274.html 一.概述 ScaleGestureDetector这个类是专门用来 ...

  7. Android应用开发基础篇(15)-----URL(获取指定网址里的图片)

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/10/2389190.html 一.概述 URL,说白了就是一个网络地址(网址),通常一个网址里包 ...

  8. Android应用开发基础篇(7)-----BroadcastReceiver

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/22/2363644.html 一.概述 BroadcastReceiver,意思就是广播信息接收 ...

  9. Android应用开发基础篇(12)-----Socket通信

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/03/2378669.html 一.概述 网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌 ...

随机推荐

  1. shell脚本中常见的一些特殊符号和作用详解

    这篇文章主要介绍了shell脚本中常见的一些特殊符号和它的作用详解,总结的很简洁,容易看懂,需要的朋友可以参考下   在编写Shell脚本时,我们需要会用到各种各样的特殊符号,通过这些特殊符号可以使我 ...

  2. poj1936---subsequence(判断子串)

    #include<stdlib.h> #include<stdio.h> int main() { ],t[]; char *p1,*p2; while(scanf(" ...

  3. nova的wsgi介绍【WIP】

    有关openstack的所有的帖子. https://www.ustack.com/blog/openstack_hacker/#Nova_Workflow 网上已经很多的分析文章了: http:// ...

  4. dataGuard client 自动切换

    使用dataguard作为HA方案,要解决的一个问题在于:后台数据库发生了切换,client连接如何做到自动切到新的primary数据库上? 如果做通用的方案,需要客户端自己提供自动重连的能力,这点大 ...

  5. SQL练习之两个列值的交换

    SELECT * FROM dbo.test2

  6. ASP.NET MVC Controller向View传值方式总结

    Controller向View传值方式总结 总结发现ASP.NET MVC中Controller向View传值的方式共有6种,分别是: ViewBag ViewData TempData 向普通Vie ...

  7. 0. chromium源代码分析 - 序

    本打算在CSDN写完这系列文字,却因为在CSDN中误删了一篇blog,该篇blog被移到了回收站.然而CSDN居然没有从回收站撤销删除的操作方法.联想到之前CSDN泄密的问题,其可靠性值得怀疑.随转向 ...

  8. Java基础之参数传递

    public class ArgsTransfer { /* * 基本数据类型直接存储在变量中,函数参数传递时,是将变量中存储的数据拷贝,函数中改变形参,和调用处的实参是不同的变量,两边互不影响 * ...

  9. MyEclipse中设置智能提示

    在实际的开发当中,编译器没有智能提示,确实是效率很低,下面我就给大家讲一下在MyEclipse中设置智能提示,方便大家的开发,希望能帮到大家. 方法一:首先,在MyEclipse的菜单栏中找到wind ...

  10. Multiwii 代码解读

    GPS部分 GPS_angle[ROLL]   = (nav[LON]*cos_yaw_x - nav[LAT]*sin_yaw_y) /10;GPS_angle[PITCH]  = (nav[LON ...