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

 
触摸,手势操作已经很好的融入了我们的生活。那么Android开发中触摸事件要如何捕捉?如何处理?如何识别手势?事件的传递机制又是怎么样的?下面我们将通过一个小例子来进行这方面的学习。
先看效果图
<ignore_js_op>
如上图所示,就是一个跟随手指移动的按钮。用来演示我们接下来要说的onTouch事件和手势操作。
 
为了让大家看懂里面的代码,我们来先介绍一下基础知识。


onTouch事件

做什么都好先了解原理以后的工作就会更简单,关于手势以及我们熟悉的onclick,
onLongClick事件都是基于对onTouch事件的捕捉和处理。那么在使用手势工具类的前提下我们应该去学习了解基本的onTouch事件。
onTouch常用的以下4个事件:
1、ACTION_DOWN:
表示按下了屏幕,第一个执行也是必然执行的方法。
2、ACTION_MOVE:
表示为移动手势,会不断的执行直到触摸停止。
3、ACTION_UP :
表示为离开屏幕,触摸停止的时候执行。
4、ACTION_CANCEL:
表示取消手势,不会由用户产生,而是由程序产生的。
一个Action_DOWN, 多个ACTION_MOVE, 1个ACTION_UP,就构成了Android中众多的事件。



onTouch的参数

View
受到Touch事件的view对象
MotionEvent
包含的事件的详细信息,例如触摸点的信息,触摸事件类型的信息等
MotionEvent的方法例如getRowX所描述的都是触摸点的信息。


几个重要方法的说明:

getRowX:触摸点相对于屏幕的坐标
getX: 触摸点相对于view的坐标
getTop: 按钮左上角相对于父view(LinerLayout)的y坐标
getLeft: 按钮左上角相对于父view(LinerLayout)的x坐标


onTouch的返回值

这个部分涉及到事件传递和处理机制,详细的不在此介绍。
作用:
这里的返回值代表的是,对于这个触摸事件touch是否已经处理完成。
如果我们设置返回值为true代表的是处理完成,这样就不会再传递给下一个对象。也就是说后面的控件或者对象就不会接收到触摸事件了。
反之,后面的对象或控件会在此接收到这个触摸事件并被调用。



实践

在学习基础知识之后,我们来看看如何使用这些来实现一个可以拖动的按钮吧。
思路
这里的主要思路就是在ACTION_DOWN按下的第一时间记录下初始的状态,在ACTION_MOVE滑动事件中不断的刷新按钮的位置。
为了保证有我们正常理解下的点击事件发生,下面我还加了位置是否移动的判断。
下面是实现该功能的内部类

class MyOnTouch implements OnTouchListener{

int[] temp = new int[] { 0, 0 };

Boolean ismove = false;

int downX = 0;

int downY = 0;

@Override

public boolean onTouch(View v, MotionEvent event) {

int eventaction = event.getAction();

int x = (int) event.getRawX();

int y = (int) event.getRawY();

switch (eventaction) {

case MotionEvent.ACTION_DOWN: // touch down so check if the

temp[0] = (int) event.getX();

temp[1] = y - v.getTop();

downX = (int) event.getRawX();

downY = (int) event.getRawY();

ismove = false;

break;

case MotionEvent.ACTION_MOVE: // touch drag with the ball

v.layout(x - temp[0], y - temp[1], x + v.getWidth() - temp[0], y - temp[1] + v.getHeight());

if (Math.abs(downX - x) > 10 || Math.abs(downY - y) > 10)

ismove = true;

break;

case MotionEvent.ACTION_UP:

if (!ismove)

Toast.makeText(MainActivity.this, "你点击了这个按钮", Toast.LENGTH_LONG).show();

break;

}

return false;

}

}

然后在给按钮初始化的时候设置这个事件

touchButton.setOnTouchListener(new MyOnTouch());

手势操作

关于手势操作,这里其实说的是Android提供的工具类,通过GestureDetector 类来识别和处理onTouch事件,简化使用。
一般用到下面的三个类。
android.view.GestureDetector
手势操作的识别类,通过他来使用下面的识别接口。
android.view.GestureDetector.SimpleOnGestureListener
手势识别的接口类,使用他可以按需重载自己想要的方法,方法多
android.view.GestureDetector.OnGestureListener;
手势识别的类,SimpleOnGestureListener接口的父类。使用他需要实现他所有的方法。


方法说明:

OnGestureListener有下面的几个方法:
按下(onDown):
在按下时调用。
抛掷(onFling):
手指在触摸屏上迅速移动,并松开的动作。
长按(onLongPress):
手指按在持续一段时间,并且没有松开。
滚动(onScroll):
手指在触摸屏上滑动。
按住(onShowPress):
手指按在触摸屏上,它的时间范围在按下起效,在长按之前。
抬起(onSingleTapUp):
手指离开触摸屏的那一刹那。
SimpleOnGestureListener比OnGestureListener多出来的方法:
 
双击(onDoubleTap)
双击的第二下Touch down时触发
双击事件(onDoubleTapEvent)
双击的第二下Touch down和up都会触发一次,可用e.getAction()区分。



实践

好了,学习完了基础知识之后我们来用手势操作的工具类来实现我们的小按钮吧。
下面来实现我们的手势操作内部类。这里我直接实现了OnGestureListener 接口,为了更好的演示效果。
class MyGesture implements OnTouchListener, OnGestureListener {

GestureDetector myGesture = new GestureDetector(MainActivity.this,this);

View view = null;

int[] temp = new int[] { 0, 0 };

@Override

public boolean onTouch(View v, MotionEvent event) {

//这一步只是我的强迫症而已,因为onTouch事件是不断被调用的

if(view == null)

view = v;

myGesture.onTouchEvent(event);

return false;

}

//在按下时调用 

@Override

public boolean onDown(MotionEvent e) {

temp[0] = (int) e.getX();

temp[1] = ((int) e.getRawY()) - view.getTop();

return false;

}

//手指在触摸屏上迅速移动,并松开的动作。

@Override

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,

float velocityY) {

return false;

}

//长按的时候调用

@Override

public void onLongPress(MotionEvent e) {

}

//按住然后滑动时调用

@Override

public boolean onScroll(MotionEvent e1, MotionEvent e2,

float distanceX, float distanceY) {

int x = (int) e2.getRawX();

int y = (int) e2.getRawY();

view.layout(x - temp[0], y - temp[1], x + view.getWidth() - temp[0], y - temp[1] + view.getHeight());

return false;

}

// 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发 

// 注意和onDown()的区别,强调的是没有松开或者拖动的状态

@Override

public void onShowPress(MotionEvent e) {

}

// 用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发

@Override

public boolean onSingleTapUp(MotionEvent e) {

Toast.makeText(MainActivity.this, "你点击了按钮", Toast.LENGTH_LONG).show();

return false;

}

}

然后在使用的时候给我们的按钮设置进去就好了

touchButton.setOnTouchListener(new MyGesture());

在内部类的开头初始化我们的GestureDetector 处理类

GestureDetector myGesture = new GestureDetector(MainActivity.this,this);
[Java] 纯文本查看 复制代码
?
1
GestureDetector myGesture = new GestureDetector(MainActivity.this,this); 在onTouch方法中调用GestureDetector 的方法 [Java] 纯文本查看 复制代码
?
1
myGesture.onTouchEvent(event); 关于按钮功能的说明:
可以拖动的按钮,这个功能的核心代码是 [Java] 纯文本查看 复制代码
?
1
v.layout(x - temp[0], y - temp[1], x + v.getWidth() - temp[0], y - temp[1] + v.getHeight()); 在滑动事件中调用 [Java] 纯文本查看 复制代码
?
1
view.layout(int l, int t, int r, int b)

android事件系列-onTouch事件与手势操作的更多相关文章

  1. Android开发系列之事件拦截机制

    对于Android开发者来说理解事件传递机制的重要性,我想应该是不言而喻的.在一个Activity里面,我们经常会重写onTouchEvent事件,可是重写结束之后,对于是返回true还是返回fals ...

  2. 移动端touch触摸事件(滑动效果和手势操作)

    一.定义 ①touch是移动端的触摸事件,而且是一组事件,主要有以下事件: touchstart 事件:当手指触摸屏幕的时候触发 touchmove 事件:当手指在屏幕来回滑动的时候触发 touche ...

  3. Android开发手记(30) 触摸及手势操作

    触摸操作在现在智能手机系统中起到举足轻重的作用,本文将对安卓中的触摸以及一些简单手势的操作进行简单的介绍. 1.触摸 首先是关于触摸的判断,有两种方法可以判断的触摸操作. (1)setOnTouchL ...

  4. Android中各种onTouch事件

    Android里有两个类 android.view.GestureDetector android.view.GestureDetector.SimpleOnGestureListener 1) 新建 ...

  5. Android View的onTouch和onClick和onLongClick事件

    这三个事件的调用顺序是: onTouch->onLongClick->onClick 先看这三个事件的处理函数: public boolean onTouch(View v, Motion ...

  6. Android学习指南之三十八:Android手势操作编程[转]

    手势操作在我们使用智能设备的过程中奉献了不一样的体验.Android开发中必然会进行手势操作方面的编程.那么它的原理是怎样的呢?我们如何进行手势操作编程呢? 手势操作原理 首先,在Android系统中 ...

  7. Android 触摸及手势操作GestureDetector

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

  8. Android onTouch事件传递机制

    Android onTouch事件介绍: Android的触摸事件:onClick, onScroll, onFling等等,都是由许多个Touch组成的.其中Touch的第一个状态肯定是ACTION ...

  9. android ontouch事件分发机制

    最近开发一个项目中,banner图左右切换和下拉刷新手势有冲突,为此去研究了事件分发,网上资料一大抄,有些讲的不对有些讲的不全,结合了网上一些博文以及源码总结如下  一个完整的触摸事件包含down,m ...

随机推荐

  1. datagridview 点击列标题排序

    开发winform中,平时经常用到数据列表,我们大多选用datagridview,但是此控件本身没有排序的功能.参阅网上资料.留下标记,以后备用. datagridview的数据显示一般是通过数据绑定 ...

  2. 【剑指offer】和为S的连续整数序列

    找到所有和为S的连续整数序列,序列长度>=2 我的思路:数学法,限定首元素范围,计算序列长度. 书上解法:用small和big两个游标记录序列的开始和结束位置,调整游标. 我的解法: /* ​直 ...

  3. 思考 ”前端开发人员都在关注的 GitHub 资源“

    点这里 原文: 资源 免费的计算机编程类中文书籍 免费编程书籍 计算机科学论文 codeparkshare Python初学者书籍.视频.资料.社区推荐 Python资料汇总 app应用推荐 码农周刊 ...

  4. Android中的Context详解

    前言:本文是我读<Android内核剖析>第7章 后形成的读书笔记 ,在此向欲了解Android框架的书籍推荐此书. 大家好,  今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友---- ...

  5. IOS笔记 #pragma mark的用法和作用(方便查找和导航代码)

    简单的来说就是为了方便查找和导航代码用的.   下面举例如何快速的定位到我已经标识过的代码.     #pragma mark 播放节拍器 - (void) Run:(NSNumber *)tick{ ...

  6. springmvc的系统学习之配置方式

    资源:尚学堂  邹波 springmvc框架视频  一.springMVC 工作流程        页面请求---->控制器(Controller DispatcherServlet)----& ...

  7. Junit单元测试学习笔记二

    我们使用Eclipse自动生成了一个测试框架,在这篇文章中,我们来仔细分析一下这个测试框架中的每一个细节,知其然更要知其所以然,才能更加熟练地应用JUnit4. 一.     包含必要地Package ...

  8. Spring框架学习之第8节

    <bean id=”foo” class=”…Foo”> <property name=”属性”> <!—第一方法引用--> <ref bean=”bean对 ...

  9. java开发--struts2 标签库使用

    在工程中使用struts2标签 一.struts2标签定义文件在struts2-core-2.0.11.1\META-INF 下面,文件名为struts-tags.tld 二.如果工程使用了servl ...

  10. 有直接运行的runas命令,XP就有

    net user administrator /active:yes runas /user:ComputerName\Administrator /savecred “C:\Path\To\Prog ...