先测试单点触摸事件,它适用于所有android版本。我们在视图中注册一个OnTouchListener接口,并把触摸时间传递给这个接口实现。OnTouchListener接口只有一个方法:public abstract boolean onTouch(View  v, MotionEvent event)

第一个参数是分派该触摸事件的View,第二个参数是获得触摸事件的参数。

OnTouchListener可在任何View中实现中通过View.setOnTouchListener方法进行注册。在MotionEvent被分派给View本身之前会先调用OnTouchListener方法。我们可在onTouch()方法的实现中返回true通知该View,我们已经处理事件。如果返回为false,那么View将自己处理该事件。

MotionEvent实例包含如下3个我们关心的方法:

MotionEvent.getX()和MotionEvent.getY();这两个方法报告触摸事件相对于View的X和Y坐标。坐标原点位于该视图左上角,X轴指向右边,Y轴指向下。坐标是以像素为单位。该方法返回浮点型数据,因此该坐标具有亚像素精度。

MotionEvent.getAction():返回触摸事件的类型。它是一个整型数,具有如下值之一:MotionEvent.ACTION_DOWN、

MotionEvent.ACTION_MOVE、MotionEvent.ACTION_CANCEL和MotionEvent.ACTION_UP。

顾名思义,当手指触摸屏幕时,将触发MotionEvent.ACTION_DOWN事件。

当手指移动时,则触发MotionEvent.ACTION_MOVE事件。只要手指没有完全脱离屏幕,总可以获得MotionEvent.ACTION_MOVE事件

当手指再次离开屏幕时,MotionEvent.ACTION_UP事件就会触发。

MotionEvent.ACTION_CANCEL事件则稍微神秘。文档说明当前手势取消时会触发该事件,我们还是把它假设为MotionEvent.ACTION_UP事件。

下面是测试代码:

[java] view plaincopy
  1. package org.example.ch04_android_basics;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.util.Log;
  5. import android.view.MotionEvent;
  6. import android.view.View;
  7. import android.view.View.OnTouchListener;
  8. import android.widget.TextView;
  9. public class SingleTouchTest extends Activity implements OnTouchListener{
  10. StringBuilder builder = new StringBuilder();
  11. TextView textView;
  12. @Override
  13. public boolean onTouch(View v, MotionEvent event) {
  14. // TODO Auto-generated method stub
  15. builder.setLength(0);
  16. switch(event.getAction()){
  17. case MotionEvent.ACTION_DOWN:
  18. builder.append("down, ");
  19. break;
  20. case MotionEvent.ACTION_MOVE:
  21. builder.append("move, ");
  22. break;
  23. case MotionEvent.ACTION_CANCEL:
  24. builder.append("cancle, ");
  25. break;
  26. case MotionEvent.ACTION_UP:
  27. builder.append("up, ");
  28. break;
  29. }
  30. builder.append(event.getX());
  31. builder.append(", ");
  32. builder.append(event.getY());
  33. String text = builder.toString();
  34. Log.d("TouchTest", text);
  35. textView.setText(text);
  36. return true;
  37. }
  38. @Override
  39. protected void onCreate(Bundle savedInstanceState) {
  40. // TODO Auto-generated method stub
  41. super.onCreate(savedInstanceState);
  42. textView = new TextView(this);
  43. textView.setText("Touch and drag (one finger only)!");
  44. textView.setOnTouchListener(this);
  45. setContentView(textView);
  46. }
  47. }  

    对于处理多点触摸事件就复杂的多,Android2.2版本后对多点触摸做了修改,添加了新的方法和常量,甚至重命名了常量。这些改变可能会让处理多点触摸容易些。不过只支持Android2.2以后的版本,为了支持Android2.0--Android2.21版本,我们使用Android2.0的API。

    当处理多点触摸事件时,我们使用重载的方法,它们带有一个所谓的指针索引,如event.getX(pointerIndex);

    pointIndex是MotionEvent的内部数组中的一个索引,它包含特定手指触摸屏幕事件的坐标值。而真正识别屏幕上的一根手指是指针ID。指针ID是一个任意数字,可以唯一标识触摸屏幕的一个指针的实例。有一个方法MotionEvent.getPointerIdentifier(int pointerIndex),它返回一个基于指针索引的指针ID。只要手指还触摸在屏幕上,一个指针ID就与一根手指保持相同,而指针索引就不一定这样了。先来看看是如何获取指针索引:

    int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;

    ACTION_POINTER_ID_MASK的常量的值是0xff00,因此低8位为0,高8位为15,用于保存事件的指针索引。

    整数的低8位可从event.getAction()方法返回得到,用于保存事件类型的值。我们通过MotionEvent.ACTION_POINTER_ID_SHIFT来移位,该值为8,因此实际上是将第15位移到第8位,第7位移到第0位。注意我们是获取pointerIndex而常量却是XXX_POINTER_ID_XXX而不是XXX_POINTER_INDEX_XXX

    获取事件类型,我们只需屏蔽指针索引:

    int action = event.getAction() & MotionEvent.ACTION_MASK;

    这里我们会遇到新的事件类型,

    MotionEvent.ACTION_POINTER_DOWN:除了第一根手指外的任何手指触摸屏幕,都将发生该事件,而第一根手指仍然产生MotionEvent.ACTION_DOWN事件。

    MotionEvent.ACTION_POINTER_UP:多根手指触摸屏幕而一根手指离开屏幕时,将发生该事件。最后一根手指离开屏幕将产生MotionEvent.ACTION_UP事件,而该手指不一定是第一个触摸屏幕的手指。为了检查单个MotionEvent中包含几个事件,可使用MotionEvent.getPointerCount()方法,它会告诉我们MotionEvent中包含多少根手指的坐标。然后我们可通过MotionEvent.getX()、

    MotionEvent.getY()和MotionEvent.getPointerId()方法来得到指针ID和从指针索引0到MotionEvent.getPointerCount() - 1的坐标值。

    测试代码如下:

    [java] view plaincopy
    1. package org.example.ch04_android_basics;
    2. import android.app.Activity;
    3. import android.os.Bundle;
    4. import android.view.MotionEvent;
    5. import android.view.View;
    6. import android.view.View.OnTouchListener;
    7. import android.widget.TextView;
    8. public class MultiTouchTest extends Activity implements OnTouchListener {
    9. StringBuilder builder = new StringBuilder();
    10. TextView textView;
    11. float[] x = new float[10];
    12. float[] y = new float[10];
    13. boolean[] touched = new boolean[10];
    14. int[] id = new int[10];
    15. private void updateTextView(){
    16. builder.setLength(0);
    17. for(int i = 0; i < 10; i++){
    18. builder.append(touched[i]);
    19. builder.append(", ");
    20. builder.append(id[i]);
    21. builder.append(", ");
    22. builder.append(x[i]);
    23. builder.append(", ");
    24. builder.append(y[i]);
    25. builder.append("\n");
    26. }
    27. textView.setText(builder);
    28. }
    29. @Override
    30. protected void onCreate(Bundle savedInstanceState) {
    31. // TODO Auto-generated method stub
    32. super.onCreate(savedInstanceState);
    33. textView = new TextView(this);
    34. textView.setText("Touch and drag (multiple fingers supported)!");
    35. textView.setOnTouchListener(this);
    36. setContentView(textView);
    37. for(int i = 0; i < 10; i++){
    38. id[i] = -1;
    39. }
    40. updateTextView();
    41. }
    42. @Override
    43. public boolean onTouch(View v, MotionEvent event) {
    44. // TODO Auto-generated method stub
    45. int action = event.getAction() & MotionEvent.ACTION_MASK;
    46. int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >>
    47. MotionEvent.ACTION_POINTER_ID_SHIFT;
    48. int pointerCount = event.getPointerCount();
    49. for(int i = 0; i < 10; i++){
    50. if(i >= pointerCount){
    51. touched[i] = false;
    52. id[i] = -1;
    53. continue;
    54. }
    55. if(event.getAction() != MotionEvent.ACTION_MOVE && i != pointerIndex){
    56. /* If it's an up/down/cancel/out event, mask the id to see if
    57. we should process it for this touch point */
    58. continue;
    59. }
    60. int pointerId = event.getPointerId(i);
    61. switch(action){
    62. case MotionEvent.ACTION_DOWN:
    63. case MotionEvent.ACTION_POINTER_DOWN:
    64. touched[i] = true;
    65. id[i] = pointerId;
    66. x[i] = (int)event.getX(i);
    67. y[i] = (int)event.getY(i);
    68. break;
    69. case MotionEvent.ACTION_UP:
    70. case MotionEvent.ACTION_POINTER_UP:
    71. case MotionEvent.ACTION_OUTSIDE:
    72. case MotionEvent.ACTION_CANCEL:
    73. touched[i] = false;
    74. id[i] = -1;
    75. x[i] = (int)event.getX(i);
    76. y[i] = (int)event.getY(i);
    77. break;
    78. case MotionEvent.ACTION_MOVE:
    79. touched[i] = true;
    80. id[i] = pointerId;
    81. x[i] = (int)event.getX(i);
    82. y[i] = (int)event.getY(i);
    83. break;
    84. }
    85. }
    86. updateTextView();
    87. return true;
    88. }
    89. }

Android单点触摸与多点触摸相关推荐

  1. Android游戏开发之单点触摸与多点触摸

    Android游戏开发之单点触摸与多点触摸的响应方式 游戏开发中的触摸事件 在游戏开发中监听屏幕触摸事件须要在View中重写父类onTouchEvent方法,在重写的方法中拦截用户触摸屏幕的一些信息, ...

  2. android怎么监听多点触摸_Android开发中多点触摸的实现方法

    Android多点触控需要LCD驱动和程序设计支持,其实我们只要采用电容屏触摸手机的技术即可,接下来,就让爱站技术频道小编来讲解Android开发中多点触摸的实现方法吧! 多点触摸技术在实际开发过程中 ...

  3. android怎么监听多点触摸_Android多点触摸交互处理

    触摸操作是安卓最基本的交互方法,掌握多点触摸的开发可增强应用交互体验.首先需要了解触摸事件的侦听和传递,同时,本文介绍了单点.多点触摸的使用方法,并在此基础上,使用多点触控完成了一个缩放照片的简单例子 ...

  4. android怎么监听多点触摸_什么是多点触控技术,有哪些用途

    自从乔布斯将触控技术用于苹果手机上,很多的手机厂商纷纷效仿,触控技术几乎成为手机的"标配".其实,触控技术早就存在,只是一直未能大面积用于各种设备中,本文将带您认识神奇的触控技术. ...

  5. android怎么监听多点触摸_大尺寸触摸屏厂家定制多点触摸框

    深圳融创方圆是订做红外大尺寸触摸屏生产厂家,弧形/直角/异形/U型大尺寸红外多点触摸框定做15寸-1000寸超大尺寸红外触控屏可以用于配合液晶拼接屏,DLP拼接屏,无缝拼接屏,小间距LED.互动投影. ...

  6. android怎么监听多点触摸_110寸高清触摸一体机

    110寸高清触摸一体机也是叫110寸会议平板,110寸高清触控一体机,110寸教学培训触控一体机,110寸展厅触摸一体机,110寸高清交互会议机,110寸展示查询触摸一体机,110寸移动壁挂触控显示屏 ...

  7. 5.触摸touch,单点触摸,多点触摸,触摸优先和触摸事件的吞噬

     1 触摸 Coco2dx默认只有CCLayer及其派生类才有触摸的功能. 2 单点触摸 打开触摸开关和触摸方式 setTouchEnabled(true); setTouchMode(kCCTo ...

  8. Unity判断手势的滑动方向,单点触摸和多点触摸,并获取刚触摸以及触摸结束事的坐标

    Unity判断手势触摸的类型 ,判断手势的滑动方向,并获取刚触摸以及触摸结束事的坐标 本章咱们一起来看下unity对有触摸手势做出的响应 单点触摸 Input.touchCount==1 移动触摸 I ...

  9. android 图片放大缩小 多点触摸,Android 多点触摸(图片放大缩小)

    就不说什么了,有注释 基本有基础的都看得懂 欢迎加入我的交流群: 386451316 main.xml文件 xmlns:tools="http://schemas.android.com/t ...

  10. Android 4.0屏蔽式多点触摸

    比方这张图.我想不接或者接单,二者仅仅能点一个,不能同一时候点击,否则会造成混乱.我们仅仅要在嵌套他们俩的布局中增加这么一段话: android:splitMotionEvents="fal ...

最新文章

  1. 7000 界面语言不升级_仅限今日!手把手教你C++图形界面开发|附完整代码,海量干货!...
  2. OpenCV形态学变换函数morphologyEx()闭运算的使用
  3. SpringBoot新版
  4. http 长连接 短连接
  5. python transform_Pandas的数据分组-transform函数
  6. 用Oracle归档日志进行恢复方法
  7. MySQL函数少传参数_Mysql中的少用函数
  8. matlab elif,MATLAB与fftfilt相当于Python
  9. 常见的php后门,有趣的PHP后门
  10. 量子计算与通讯的基本原理(量子纠缠)
  11. onclick事件诡异事件 一
  12. 浅谈Web Worker和Service worker
  13. wps下载的简历无法删除空白页
  14. STM32通过IIC读取BH1750光照数据
  15. python中bytearray函数_Python内置函数—bytearray
  16. 重拾java基础知识总结(超级经典)
  17. Unity给力插件之MegaFiers
  18. 2007年web开发技术预言
  19. 校园服务器虚拟机规划与设计,校园网办公楼网络规划与设计1.pdf
  20. python单词软件哪个好_还在用背单词App?使用Python开发英语单词自测工具,助你逆袭单词王!...

热门文章

  1. Paragraph ended before \CJK@XX was complete
  2. python登陆pc微信_GitHub - ccboby/WechatPCAPI: 微信PC版的API接口,可通过Python调用微信获取好友、群、公众号列表,并收发消息等功能。...
  3. 阿里云服务器使用xshell连接
  4. 计算机视觉 || Canny算子实现边缘分割并进一步处理
  5. python规模大小的指标是_Python 做证券指数三种策略分析 - 最高收益,最大规模,最小风险...
  6. 最好的6个大数据处理分析工具
  7. 英国研制出新型机器人具有10种人类表情(组图)
  8. 人力资源管理-各类激励理论
  9. c语言ip判断程序,IP判断 (C语言代码)
  10. 学习计算机基础必读的4本经典入门书籍,自学编程必备书单!