---恢复内容开始---

1.Touch事件传递机制

  过程有点儿类似于栈, ViewGroup的子类有都继承它的以下3个方法:

  public boolean dispatchTouchEvent(MotionEvent event);  //消息分发, 相当于在一个函数中调用其他函数

  public boolean onInterceptTouchEvent(MotionEvent event); // 拦截消息

  public boolean onTouchEvent(MotionEvent event);    // 触屏处理, 如果完成处理则返回true, 相当于break直接退出消息处理,如果没有完成处理则返回false, 返回到分发消息给它的View控件的onTouchEvent()继续进行递归处理.制定返回到消息来源处

  消息往下分发称为隧道方式, 触屏消息在子视图中没有处理完传递给上层控件,称为冒泡方式.

2.区别onTouch() 和 onTouchEvent()

  onTouch(): 定义在接口OnTouchListener中, 绑定触屏监听器后覆写这个方法实现自定义触屏行为

  onTouchEvent(): Activity 中的方法, 当屏幕有触摸事件时调用这个方法, 如果一直按着屏幕,就会一直循环调用,我的电脑上大概几十毫秒调用一次,不过这个不用管. 当然, onTouch()方法也会在你一直按着绑定的控件的时候一直循环调用.

3.onTouchEvent()处理的消息

  onTouchEvent()方法是从Activity中继承下来的, 所以只需要在Activity中覆写就可以了, 它处理以下3种消息

  1) 屏幕按下: MotionEvent.ACTION_DOWN

  2) 从屏幕上释放: MotionEvent.ACTION_UP

  3) 在屏幕上移动: MotionEvent.ACTION_MOVE

 @Override
public boolean onTouchEvent(MotionEvent event) {
int[] events = {
MotionEvent.ACTION_DOWN,
MotionEvent.ACTION_MOVE,
MotionEvent.ACTION_UP,
MotionEvent.ACTION_CANCEL,
MotionEvent.ACTION_OUTSIDE,
MotionEvent.ACTION_POINTER_DOWN,
MotionEvent.ACTION_POINTER_UP,
MotionEvent.EDGE_TOP,
MotionEvent.EDGE_BOTTOM,
MotionEvent.EDGE_LEFT,
MotionEvent.EDGE_RIGHT
};
String[] szEvent = {
"MotionEvent.ACTION_DOWN",
"MotionEvent.ACTION_MOVE",
"MotionEvent.ACTION_UP",
"MotionEvent.ACTION_CANCEL",
"MotionEvent.ACTION_OUTSIDE",
"MotionEvent.ACTION_POINTER_DOWN",
"MotionEvent.ACTION_POINTER_UP",
"MotionEvent.EDGE_TOP",
"MotionEvent.EDGE_BOTTOM",
"MotionEvent.EDGE_LEFT",
"MotionEvent.EDGE_RIGHT"
};
for(int i=0;i<events.length;++i){
if(events[i] == event.getAction()){
Log.v(TAG,szEvent[i]);
break;
}
}
return super.onTouchEvent(event);
}

  将上面的方法覆盖Activity的方法即可, 值得注意的是,MOVE事件会在你点击释放过程中触发, 而且触发多次! 所以在手势识别过程部分函数参数会只记录最后一个MOVE事件

4.手势识别: android.view.GestureDetector类 + OnGestureListener接口

  里面有很多方法,覆写之后可以实现多种触屏效果, 增加用户体验

  使用GestureDetector对象,为这个对象添加一个监听器,并覆写方法. 这个对象可以作为Activity的属性, 当然也就是最这个Activity进行手势解析了.然后再覆写Activity的onTouchEvent方法, 对触屏事件进行监听即可.

 private GestureDetector gestureDetector = new GestureDetector(new GestureDetector.OnGestureListener() {
@Override
public boolean onDown(MotionEvent e) {
// 按下屏幕的时候
Toast.makeText(MainActivity.this,"onDown",Toast.LENGTH_SHORT).show();
Log.v(TAG,"onDown");
return false;
} @Override
/**
* 点击了屏幕, 但是没有移动和弹起动作. 与onDown的区别:
* onDown():一旦按下屏幕,就尝试onDown事件
* onShowPress(): onDown事件产生后,一段时间内没有移动和弹起(先产生了onDown事件)
*
*/
public void onShowPress(MotionEvent e) {
Log.v(TAG,"onShowPress");
Toast.makeText(MainActivity.this,"onShowPress",Toast.LENGTH_SHORT).show();
} @Override
/**
* 轻击触摸屏和弹起,这个过程中如果产生了onLongPress,onScroll 和 onFling事件,就不会产生onSingleTabUp事件
*/
public boolean onSingleTapUp(MotionEvent e) {
Log.v(TAG,"onSingleTabUp");
Toast.makeText(MainActivity.this, "onSingleTagUp", Toast.LENGTH_SHORT).show();
return false;
} @Override
/**
* 滚动事件, 当在屏幕上迅速移动,会产生onScroll,由ACTION_MOVE产生
* @param: distanceX: 距离上次产生onScroll事件后, X轴的移动距离
*/
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
Log.v(TAG,"onScroll");
Toast.makeText(MainActivity.this, "onScroll", Toast.LENGTH_SHORT).show();
return false;
} @Override
public void onLongPress(MotionEvent e) {
Log.v(TAG,"onLongPress");
Toast.makeText(MainActivity.this, "onLongPress", Toast.LENGTH_SHORT).show();
} @Override
/**
* @param: e1: 第一个ACTION_DOWN MotionEvent
* @param: e2: 最后一个ACTION_MOVE MotionEvent
* @param: velocityX: X轴上的移动速度 px/s
* @param: velocityY: Y轴上的移动速度
*/
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.v(TAG,"onFling");
Toast.makeText(MainActivity.this, "onFling", Toast.LENGTH_SHORT).show(); return false;
}
}); @Override
public boolean onTouchEvent(MotionEvent event) {
Log.v(TAG,"onTouchEvent");
if(gestureDetector.onTouchEvent(event)){
return true;
}else{
  return super.onTouchEvent(event); //未完成处理交给上层控件
}
}

5.处理键盘事件

  覆写Activity的onKeyDown()即可,有的需要在AndroidManifest.xml文件中添加权限...

 public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode){
case KeyEvent.KEYCODE_HOME: //好像说不再支持了,需要修改框架源码实现,有点儿复杂,期待新发现
Log.v(TAG,"HOME up");
break;
case KeyEvent.KEYCODE_BACK:
Log.v(TAG,"BACK up");
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
Log.v(TAG,"Left up");
break;
}
// return true;
return super.onKeyUp(keyCode, event);
}


-->

Android Touch 事件总结的更多相关文章

  1. Android Touch事件传递机制 二:单纯的(伪生命周期)

    转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...

  2. Android Touch事件传递机制 一: OnTouch,OnItemClick(监听器),dispatchTouchEvent(伪生命周期)

      ViewGroup View  Activity dispatchTouchEvent 有 有 有 onInterceptTouchEvent 有 无 无 onTouchEvent 有 有 有 例 ...

  3. Android touch 事件传递机制

    前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事 ...

  4. Android touch事件的派发流程

    Android TouchEvent事件传递机制 通俗易懂,能够了解Touch事件派发的基本流程. Android中的dispatchTouchEvent().onInterceptTouchEven ...

  5. Android Touch事件传递机制通俗讲解

    在讲正题之前我们讲一段有关任务传递的小故事,抛砖迎玉下: 话说一家软件公司,来一个任务,分派给了开发经理去完成: 开发经理拿到,看了一下,感觉好简单,于是 开发经理:分派给了开发组长 开发组长:分派给 ...

  6. Android Touch事件原理加实例分析

    Android中有各种各样的事件,以响应用户的操作.这些事件可以分为按键事件和触屏事件.而Touch事件是触屏事件的基础事件,在进行Android开发时经常会用到,所以非常有必要深入理解它的原理机制. ...

  7. (转)Android Touch事件传递机制

    -----来源:http://www.trinea.cn/android/touch-event-delivery-mechanism/ 介绍Android Touch事件的传递机制. 不少朋友私信问 ...

  8. Android Touch事件传递机制具体解释 上

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/37961997 近期总是遇到关于Android Touch事件的问题,如:滑动冲突的问题,曾经 ...

  9. Android Touch事件传递机制 二:单纯的(伪生命周期) 这个清楚一点

    转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...

  10. Android Touch事件之二:dispatchTouchEvent()和onTouchEvent()篇

    2015-12-01 15:06:14 Android Touch事件第一篇:Touch事件在父ViewGroup和子View之间的传递简单分析了事件的传递流程,这次深入了解下dispatchTouc ...

随机推荐

  1. Appium ios新的定位方式FindsByIosNSPredicate (没有试 先记录在这里) 有个 driver.find_element_by_ios_uiautomation() 研究下 ios的定位

    这个定位方式需要用java-client -5.0.版本,4.x的版本没有这个定位方式 //输入账号和密码 driver.findElementByIosNsPredicate("value ...

  2. 为什么Java程序占用的内存比实际分配给它的要多

    很多人错误的认为运行Java程序时使用-Xmx和-Xms参数指定的就是程序将会占用的内存,但是这实际上只是Java堆对象将会占用的内存.堆只是影响Java程序占用内存数量的一个因素.要更好的理解你的J ...

  3. Flask之视图(二)

    2.2 扩展 上下文:相当于一个容器,保存了Flask程序运行过程中的一些信息. Flask中有两种上下文,请求上下文和应用上下文. 请求上下文(request context) request和se ...

  4. WePY 在手机充值小程序中的应用与实践

    wepyjs 发布了两个月了,中间经历了很多版本更新,也慢慢开始有一些用户选择 wepyjs 作为开发框架来开发小程序,比如一些线上小程序. 以及一些来自网上的 wepyjs 的相关资源: demo源 ...

  5. HTTP接口开发专题四(接收http接口发送过来的请求)

    前面讲了调用http接口的操作,这篇讲下接收http接口的操作.(以Spring MVC为例) 1)如果发送过来的内容类型是application/x-www-form-urlencoded ,则按照 ...

  6. Halcon中循环读取文件的实现以及数字与字符的转换

    在循环读取文件的位置时,常用到数字与字符的转换. 数字与字符的转换 将字符转换为数字 tuple_number(StringImageIndex,IntImageIndex)` 1 2 1 2 将数字 ...

  7. prettytable模块(格式化打印内容)

    1.查看系统是否已经安装prettytable模块 2.下载prettytable模块 登陆:https://pypi.python.org/pypi/PrettyTable 3.安装PrettyTa ...

  8. e8000051

    Unable to install package (e8000051). Please check used certificate validity and provisioning.. Unab ...

  9. linux命令 环境设置 顺序

    转 http://blog.csdn.net/dingxy/article/details/4016383 在登录Linux时要执行文件的过程如下: 在刚登录Linux时,首先启动 /etc/prof ...

  10. 全面了解POI操作Microsoft Office(Word、Excel、PowerPoint)

    POI 与 Microsoft Office 1. POI 简介 POI 是 Apache 下的 Jakata 项目的一个子项目,主要用于提供 java 操作 Microsoft Office 办公套 ...