触摸操作在现在智能手机系统中起到举足轻重的作用,本文将对安卓中的触摸以及一些简单手势的操作进行简单的介绍。

1、触摸

首先是关于触摸的判断,有两种方法可以判断的触摸操作。

(1)setOnTouchListener

对于View类,我们可以为View添加setOnTouchListener来获取触摸事件。我们以TextView为例,由于TextView继承自View,所以我们可以为其添加一个触摸监听。然后将触摸事件交给OnTouchListener处理。比如,我们在触摸TextView时改变这个TextView的文字。

        textView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = MotionEventCompat.getActionMasked(event); switch (action){
case MotionEvent.ACTION_DOWN :
textView.setText("TextAction: DOWN"); return true;
case MotionEvent.ACTION_UP :
textView.setText("TextAction UP"); return true;
default: return false;
}
}
});

其中,我们通过getActionMasked(MotionEvent event)取得触摸事件的类型ID,然后对其分别判断。当然,还有一些其他的事件:

public static final int ACTION_DOWN         = 0; //单点触摸动作
public static final int ACTION_UP = 1; //单点触摸离开动作
public static final int ACTION_MOVE = 2; //触摸点移动动作
public static final int ACTION_CANCEL = 3; //触摸动作取消
public static final int ACTION_OUTSIDE = 4; //触摸动作超出边界
public static final int ACTION_POINTER_DOWN = 5; //多点触摸动作
public static final int ACTION_POINTER_UP = 6; //多点离开动作

(2)onTouchEvent

对于Activity,我们可以通过重载onTouch方法来获取触摸事件。我们这里通过触摸MainActivity然后通过一个TextView来显示触摸的信息。

    @Override
public boolean onTouchEvent(MotionEvent event) { int action = MotionEventCompat.getActionMasked(event); switch (action){
case MotionEvent.ACTION_DOWN :
textView.setText("MainAction: DOWN"); return true;
case MotionEvent.ACTION_UP :
textView.setText("MainAction UP"); return true;
default: return super.onTouchEvent(event);
}
}

完整代码为:

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.MotionEventCompat;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView; public class MainActivity extends Activity { private TextView textView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); textView = (TextView)findViewById(R.id.textView);
textView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = MotionEventCompat.getActionMasked(event); switch (action) {
case MotionEvent.ACTION_DOWN:
textView.setText("TextAction: DOWN");
return true;
case MotionEvent.ACTION_UP:
textView.setText("TextAction UP");
return true;
default:
return false;
}
}
});
} @Override
public boolean onTouchEvent(MotionEvent event){ int action = MotionEventCompat.getActionMasked(event); switch (action){
case MotionEvent.ACTION_DOWN :
textView.setText("MainAction: DOWN"); return true;
case MotionEvent.ACTION_UP :
textView.setText("MainAction UP"); return true;
default: return super.onTouchEvent(event);
}
} }

2、手势识别

Android提供的onTouch方法只能处理一些简单的触摸操作比如触摸、离开、移动之类的,但是当我们处理一些复杂的手势时,这样判断就会很复杂,比如长按操作。好在Android SDK提供了另外的一些方法来处理手势的操作:GestureDetector。GestureDetector类对外提供了两个接口:OnGestureListener,OnDoubleTapListener,还有一个内部类SimpleOnGestureListener;SimpleOnGestureListener类是GestureDetector提供给我们的一个更方便的响应不同手势的类,它实现了上述两个接口,该类是static class,也就是说它实际上是一个外部类,我们可以在外部继承这个类,重写里面的手势处理方法。

使用GestureDetector,具体过程为,首先实现GestureDetector接口,然后实例化一个这个类对象,最后对Activity添加onTouchEvent处理方法即可。

(1)OnGestureListener

首先我们需要新建一个MyGesture类来实现GestureDetector的接口,这里我们需要注意的是我们必须实现所有提供的接口

按下(onDown): 刚刚手指接触到触摸屏的那一刹那,就是触的那一下。

提拉(onFling): 手指在触摸屏上迅速移动,并松开的动作。

长按(onLongPress): 手指按在持续一段时间,并且没有松开。

滚动(onScroll): 手指在触摸屏上滑动。

按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。

抬起(onSingleTapUp):手指离开触摸屏的那一刹那。

class MyGesture implements GestureDetector.OnGestureListener{

        @Override
public boolean onDown(MotionEvent event) {
textView.setText("onDown: " + event.toString());
return true;
} @Override
public boolean onFling(MotionEvent event1, MotionEvent event2,
float velocityX, float velocityY) {
textView.setText("onFling: " + event1.toString() + event2.toString());
return true;
} @Override
public void onLongPress(MotionEvent event) {
textView.setText("onLongPress: " + event.toString());
} @Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
textView.setText("onScroll: " + e1.toString() + e2.toString());
return true;
} @Override
public void onShowPress(MotionEvent event) {
textView.setText("onShowPress: " + event.toString());
} @Override
public boolean onSingleTapUp(MotionEvent event) {
textView.setText("onSingleTapUp: " + event.toString());
return true;
}
}

然后在MainActivity的onCreate方法内实例化这个类;

gestureDetector = new GestureDetector(MainActivity.this, new MyGesture());

最后,根据我们实例化的对象为MainActivity添加时间处理方法:

    @Override
public boolean onTouchEvent(MotionEvent event){ gestureDetector.onTouchEvent(event); return super.onTouchEvent(event);
}

完整的代码如下:

import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.TextView; public class MainActivity extends Activity { private TextView textView;
private GestureDetector gestureDetector; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); textView = (TextView)findViewById(R.id.textView);
gestureDetector = new GestureDetector(MainActivity.this, new MyGesture());
} @Override
public boolean onTouchEvent(MotionEvent event){ gestureDetector.onTouchEvent(event); return super.onTouchEvent(event);
} class MyGesture implements GestureDetector.OnGestureListener{ @Override
public boolean onDown(MotionEvent event) {
textView.setText("onDown: " + event.toString());
return true;
} @Override
public boolean onFling(MotionEvent event1, MotionEvent event2,
float velocityX, float velocityY) {
textView.setText("onFling: " + event1.toString() + event2.toString());
return true;
} @Override
public void onLongPress(MotionEvent event) {
textView.setText("onLongPress: " + event.toString());
} @Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
textView.setText("onScroll: " + e1.toString() + e2.toString());
return true;
} @Override
public void onShowPress(MotionEvent event) {
textView.setText("onShowPress: " + event.toString());
} @Override
public boolean onSingleTapUp(MotionEvent event) {
textView.setText("onSingleTapUp: " + event.toString());
return true;
}
}
}

(2)SimpleOnGestureListener

从上文可以看出,我们在使用OnGestureListener的时候,需要重载一些我们用不到的方法,好在Android也为我们考虑到了这种不便,所以为我们提供了一个SimpleOnGestureListener类来方便的实现我们需要的手势。

这里我们只需要继承一下SimpleOnGestureListener类即可:

    class MyGesture extends GestureDetector.SimpleOnGestureListener{

        @Override
public boolean onDown(MotionEvent event) {
textView.setText("onDown: " + event.toString());
return true;
}
//...其他实现方法
}

完整的代码入下:

import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.TextView; public class MainActivity extends Activity { private TextView textView;
private GestureDetector gestureDetector; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); textView = (TextView)findViewById(R.id.textView);
gestureDetector = new GestureDetector(MainActivity.this, new MyGesture());
} @Override
public boolean onTouchEvent(MotionEvent event){ gestureDetector.onTouchEvent(event); return super.onTouchEvent(event);
} class MyGesture extends GestureDetector.SimpleOnGestureListener{ @Override
public boolean onDown(MotionEvent event) {
textView.setText("onDown: " + event.toString());
return true;
} @Override
public boolean onFling(MotionEvent event1, MotionEvent event2,
float velocityX, float velocityY) {
textView.setText("onFling: " + event1.toString() + event2.toString());
return true;
} @Override
public void onLongPress(MotionEvent event) {
textView.setText("onLongPress: " + event.toString());
} @Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
textView.setText("onScroll: " + e1.toString() + e2.toString());
return true;
} @Override
public void onShowPress(MotionEvent event) {
textView.setText("onShowPress: " + event.toString());
} @Override
public boolean onSingleTapUp(MotionEvent event) {
textView.setText("onSingleTapUp: " + event.toString());
return true;
}
}
}

Android开发手记(30) 触摸及手势操作的更多相关文章

  1. Android开发手记(27) Java多线程的操作

    Java中常用的有关线程的操作有,判断线程是否启动.线程强制执行.线程休眠.线程中断.线程让步.线程同步等.下面就一一举例. 首先,我们新建一个MyThread类实现Runnable接口.基于此接口进 ...

  2. Android 触摸及手势操作GestureDetector

    现在的智能手机不敢说百分百的都是触摸屏,也应该是百分之九九以上为触摸屏了,触摸屏为我们操作无键盘.无鼠标的手机系统带来了很多的便利.当用户触摸屏幕时会产生很多的触摸事件,down.up.move等等. ...

  3. android事件系列-onTouch事件与手势操作

    提示记忆:应用流程:在Activity中对控件执行 view.setOnTouchListener( OnTouchListener i);实现里面的OnTouchListener 接口中的方法,重点 ...

  4. Android开发笔记——图片缓存、手势及OOM分析

    把图片缓存.手势及OOM三个主题放在一起,是因为在Android应用开发过程中,这三个问题经常是联系在一起的.首先,预览大图需要支持手势缩放,旋转,平移等操作:其次,图片在本地需要进行缓存,避免频繁访 ...

  5. Android 开发手记一NDK编程实例

    在Android上,应用程序的开发,大部分基于Java语言来实现.要使用c或是c++的程序或库,就需要使用NDK来实现.NDK是Native Development Kit的简称.它是一个工具集,集成 ...

  6. android开发之单点触摸

    相对于多点触摸,单点触摸还是很简单的. 新建一个工程,先看看布局文件: <RelativeLayout xmlns:android="http://schemas.android.co ...

  7. 从零开始学android开发- 应用程序窗体显示状态操作requestWindowFeature

    我们在开发程序是经常会需要软件全屏显示.自定义标题(使用按钮等控件)和其他的需求,今天这一讲就是如何控制Android应用程序的窗体显示. 首先介绍一个重要方法那就是requestWindowFeat ...

  8. Android开发手记(18) 数据存储三 SQLite存储数据

    Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 SQLite 是以嵌入式为目的 ...

  9. Android开发手记(17) 数据存储二 文件存储数据

    Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 本文主要介绍如何使用文件来存储 ...

随机推荐

  1. DJANGO增加超级用户

    from django.contrib.auth.models import User user=User.objects.create_superuser('name','emailname@dem ...

  2. 报表中的Excel操作之Aspose.Cells(Excel模板)

    原文:报表中的Excel操作之Aspose.Cells(Excel模板) 本篇中将简单记录下Aspose.Cells这个强大的Excel操作组件.这个组件的强大之处,就不多说,对于我们的报表总是会有导 ...

  3. Spring MVC 中的REST支持

    本部分提供了支持 RESTful web 服务的主要 Spring 功能(或注释)的概述. @Controller 使用 @Controller 注释对将成为 MVC 中控制器的类进行注释并处理 HT ...

  4. wcf纯代码创建控制台应用

    https://svn.apache.org/repos/asf/incubator/stonehenge/contrib/stocktrader/dotnet/ stocktrader项目的dotn ...

  5. Spark(Hive) SQL数据类型使用详解(Python)

    Spark SQL使用时需要有若干“表”的存在,这些“表”可以来自于Hive,也可以来自“临时表”.如果“表”来自于Hive,它的模式(列名.列类型等)在创建时已经确定,一般情况下我们直接通过Spar ...

  6. HDU 5925 Coconuts 【离散化+BFS】 (2016CCPC东北地区大学生程序设计竞赛)

    Coconuts Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  7. sql server 2008 创建新数据库报错、创建表报错、更改表的设计报错

    一:创建数据库报错如下: 二:解决,将软件以管理员身份运行 三:创建表报错如下图: 四:解决办法,在你创建的数据库下面的安全里,找到你创建的用户,属性,添加权限,红色标注,然后确定: 五:更改表的设计 ...

  8. web.xml 详解contextConfigLocation 转

    spring的应用初始化流程一直没有搞明白,刚刚又碰到了相关的问题.决定得好好看看这个流程.我们在开发spring的项目当中基本上都会在web.xml通过: <context-param> ...

  9. 用delphi的THTTPRIO控件调用了c#写的webservice。

    用delphi的THTTPRIO控件调用了c#写的webservice. 下面是我调试时遇到的一些问题: 1,导入wsdl文件:file--new----other----wenservice---W ...

  10. HDOJ1253 胜利大逃亡 BFS

    胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...