智能终端设备的多点触控操作为我们带来了种种炫酷体验,这也使得很多Android开发者都对多点触控程序的开发感兴趣。实际上多点触控程序的实现并不是那么遥不可及,而是比较容易。本文就主要通过一个实例具体讲解多点触控程序的实现。

首先来了解一下Android中多点触控的原理。

Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC、Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouch技术,对于网页缩放、手势操作上有更好的用户体验。 在Android平台上事件均使用了MotionEvent对象方式处理,比如开始触控时会触发ACTION_DOWN,而移动操作时为ACTION_MOVE,最终放开手指时触发ACTION_UP事件。当然还有用户无规则的操作可能触发ACTION_CANCEL这个动作。

对于常规的触控操作我们都是使用内部为View的setOnTouchListener()接口实现的onTouchEvent()方法来处理。因此对于onTouchEvent方法的参数MotionEvent我们需要有一定得了解,比如:

Java代码
  1. event.getAction() //获取触控动作比如ACTION_DOWN
  2. event.getPointerCount(); //获取触控点的数量,比如2则可能是两个手指同时按压屏幕
  3. event.getPointerId(nID); //对于每个触控的点的细节,我们可以通过一个循环执行getPointerId方法获取索引
  4. event.getX(nID); //获取第nID个触控点的x位置
  5. event.getY(nID); //获取第nID个点触控的y位置
  6. event.getPressure(nID); //LCD可以感应出用户的手指压力,当然具体的级别由驱动和物理硬件决定的
  7. event.getDownTime() //按下开始时间
  8. event.getEventTime() // 事件结束时间
  9. event.getEventTime()-event.getDownTime()); //总共按下时花费时间

下面,我们根据一个项目来讲解如何实现多点触控。

在上代码之前先来看看此实例的运行效果图:

以下是实现步骤:

1、创建一个Android项目,命名为MultitouchVisible。

2、在该项目内,新建一个view,继承SurfaceView,并实现了Callback接口,这里我们命名该类为MyView.java,下面是该类地具体实现代码:

Java代码
  1. public class MyView extends SurfaceView implements SurfaceHolder.Callback{
  2. MultitouchVisible father;
  3. private static final int MAX_TOUCHPOINTS = 10;
  4. private static final String START_TEXT = "请随便触摸屏幕进行测试";
  5. private Paint textPaint = new Paint();
  6. private Paint touchPaints[] = new Paint[MAX_TOUCHPOINTS];
  7. private int colors[] = new int[MAX_TOUCHPOINTS];
  8. private int width, height;
  9. //  private float scale = 1.0f;
  10. public MyView(MultitouchVisible father) {
  11. super(father);
  12. // TODO Auto-generated constructor stub
  13. this.father=father;
  14. SurfaceHolder holder = getHolder();
  15. holder.addCallback(this);
  16. setFocusable(true); // 确保我们的View能获得输入焦点
  17. setFocusableInTouchMode(true); // 确保能接收到触屏事件
  18. init();
  19. }
  20. private void init() {
  21. // 初始化10个不同颜色的画笔
  22. textPaint.setColor(Color.WHITE);
  23. colors[0] = Color.BLUE;
  24. colors[1] = Color.RED;
  25. colors[2] = Color.GREEN;
  26. colors[3] = Color.YELLOW;
  27. colors[4] = Color.CYAN;
  28. colors[5] = Color.MAGENTA;
  29. colors[6] = Color.DKGRAY;
  30. colors[7] = Color.WHITE;
  31. colors[8] = Color.LTGRAY;
  32. colors[9] = Color.GRAY;
  33. for (int i = 0; i < MAX_TOUCHPOINTS; i++) {
  34. touchPaints[i] = new Paint();
  35. touchPaints[i].setColor(colors[i]);
  36. }
  37. }
  38. /*
  39. * 处理触屏事件
  40. */
  41. @Override
  42. public boolean onTouchEvent(MotionEvent event) {
  43. // 获得屏幕触点数量
  44. int pointerCount = event.getPointerCount();
  45. if (pointerCount > MAX_TOUCHPOINTS) {
  46. pointerCount = MAX_TOUCHPOINTS;
  47. }
  48. // 锁定Canvas,开始进行相应的界面处理
  49. Canvas c = getHolder().lockCanvas();
  50. if (c != null) {
  51. c.drawColor(Color.BLACK);
  52. if (event.getAction() == MotionEvent.ACTION_UP) {
  53. // 当手离开屏幕时,清屏
  54. }
  55. else {
  56. // 先在屏幕上画一个十字,然后画一个圆
  57. for (int i = 0; i < pointerCount; i++) {
  58. // 获取一个触点的坐标,然后开始绘制
  59. int id = event.getPointerId(i);
  60. int x = (int) event.getX(i);
  61. int y = (int) event.getY(i);
  62. drawCrosshairsAndText(x, y, touchPaints[id], i, id, c);
  63. }
  64. for (int i = 0; i < pointerCount; i++) {
  65. int id = event.getPointerId(i);
  66. int x = (int) event.getX(i);
  67. int y = (int) event.getY(i);
  68. drawCircle(x, y, touchPaints[id], c);
  69. }
  70. }
  71. // 画完后,unlock
  72. getHolder().unlockCanvasAndPost(c);
  73. }
  74. return true;
  75. }
  76. /**
  77. * 画十字及坐标信息
  78. */
  79. private void drawCrosshairsAndText(int x, int y, Paint paint, int ptr,int id, Canvas c) {
  80. c.drawLine(0, y, width, y, paint);
  81. c.drawLine(x, 0, x, height, paint);
  82. int textY = (int) (5 + 20 * ptr);
  83. c.drawText("x" + ptr + "=" + x, 10 , textY, textPaint);
  84. c.drawText("y" + ptr + "=" + y, 70 , textY, textPaint);
  85. c.drawText("id" + ptr + "=" + id, width - 55 , textY, textPaint);
  86. }
  87. /**
  88. * 画圆
  89. */
  90. private void drawCircle(int x, int y, Paint paint, Canvas c) {
  91. c.drawCircle(x, y, 40 , paint);
  92. }
  93. @Override
  94. public void surfaceChanged(SurfaceHolder holder, int format, int width,
  95. int height) {
  96. // TODO Auto-generated method stub
  97. this.width = width;
  98. this.height = height;
  99. textPaint.setTextSize(14);
  100. Canvas c = getHolder().lockCanvas();
  101. if (c != null) {
  102. // 背景黑色
  103. c.drawColor(Color.BLACK);
  104. float tWidth = textPaint.measureText(START_TEXT);
  105. c.drawText(START_TEXT, width / 2 - tWidth / 2, height / 2, textPaint);
  106. getHolder().unlockCanvasAndPost(c);
  107. }
  108. }
  109. @Override
  110. public void surfaceCreated(SurfaceHolder holder) {
  111. // TODO Auto-generated method stub
  112. }
  113. @Override
  114. public void surfaceDestroyed(SurfaceHolder holder) {
  115. // TODO Auto-generated method stub
  116. }
  117. }

3、修改主Activity类,把该view放到setContentView()中显示,具体实现如下:

Java代码
  1. public class MultitouchVisible extends Activity {
  2. /** Called when the activity is first created. */
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. //隐藏标题栏
  7. requestWindowFeature(Window.FEATURE_NO_TITLE);
  8. //设置成全屏
  9. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  10. WindowManager.LayoutParams.FLAG_FULLSCREEN);
  11. //设置为上面的MTView
  12. setContentView(new MyView(this));
  13. }
  14. }

4、到此,项目已经完成,可见多点触控实现起来并不难!运行此实例程序就能得到如上面效果图中的界面。

 

Android开发实例之多点触控程序的更多相关文章

  1. 【原】cocos2d-x开发笔记:多点触控

    在项目开发中,我们做的大地图,一个手指头按下滑动可以拖动大地图,两个手指头按下张开或者闭合,可以放大和缩小地图 在实现这个功能的时候,需要使用到cocos2d-x的多点触控功能. 多点触控事件,并不是 ...

  2. Android多点触控(图片的缩放Demo)

    本文主要介绍Android的多点触控,使用了一个图片缩放的实例,来更好的说明其原理.须要实现OnTouchListener接口,重写当中的onTouch方法. 实现效果图:       源码: 布局文 ...

  3. android小程序-电子钢琴-多点触控

    我在第一篇博客<android小程序-电子钢琴-滑动连续响应>中实现了一个简单地7键钢琴,这几天把它又完善了一下,增加了多点触控,按键也增加了一个低音区和一个高音区,使得又可以多弹一点简单 ...

  4. Android多点触控技术实战,自由地对图片进行缩放和移动

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11100327 在上一篇文章中我带着大家一起实现了Android瀑布流照片墙的效果, ...

  5. Android 多点触控与简单手势(一)

    现在一般的Android手机都会使用电容触摸屏最少可以支持两点触摸,多的可能是七八个,所以基本上都会支持多点触控, android系统中应用程序可以使用多点触控的事件来完成各种手势和场景需求. And ...

  6. Android多点触控技术

    1 简介 Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC.Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouc ...

  7. 【朝花夕拾】Android自定义View篇之(八)多点触控(上)MotionEvent简介

    前言 在前面的文章中,介绍了不少触摸相关的知识,但都是基于单点触控的,即一次只用一根手指.但是在实际使用App中,常常是多根手指同时操作,这就需要用到多点触控相关的知识了.多点触控是在Android2 ...

  8. Android 多点触控错误处理(java.lang.IllegalArgumentException: pointerIndex out of range)

    最近做View的多点触控时,每次第一次触控事件完美运行,第二次就直接崩了,错误信息如下: 01-03 00:05:44.220 4377-4410/system_process E/AndroidRu ...

  9. 关于android多点触控

    最近项目需要一个多点触控缩放的功能.然后上网查了下资料 总结一下: 首先android sdk版本很重要,比如你在AndroidManifest.xml中指定android:minSdkVersion ...

随机推荐

  1. 1306.Sequence Median(堆排序)

    1306 URAL真是没水题 以为简单的排序就好了 ME  内存限制很紧 堆排序 或者 STL 用堆排序做的 正好复习一下 都忘了 #include <iostream> #include ...

  2. OK335xS can't reset with reboot

    /*********************************************************************** * OK335xS can't reset * 说明: ...

  3. UVA 753 A Plug for UNIX 电器插座(最大基数匹配,网络流)

    题意: 给n个插座,m个设备(肯定要插电了),k种转换头可无限次使用(注意是单向的),问有多少设备最终是不能够插上插座的? 分析: 看起来就是设备匹配插座,所以答案不超过m.这个题适合用网络流来解. ...

  4. 《C#并行编程高级教程》第8章 线程池 笔记

    主要的几个概念(详细最好还是看书,配合插图看)   任务是会被分配到线程上的,而这些线程都在线程池引擎下管理 线程池引擎管理着合适数量的线程池,线程从全局队列获取工作项执行. .NET4 Framew ...

  5. 【转】Git详解之一:Git起步

    原文网址:http://blog.jobbole.com/25775/ 原文:<Pro Git> 起步 本章介绍开始使用 Git 前的相关知识.我们会先了解一些版本控制工具的历史背景,然后 ...

  6. ccr1

    Concurrency and Coordination Runtime Jeffrey Richter Code download available at:ConcurrentAffairs200 ...

  7. [selenium webdriver Java]隐式的等待同步

    Selenium WebDriver提供了隐式等待来同步测试.当使用了隐式等待执行测试的时候,如果WebDriver没有在DOM中找到元素,将继续等待,超出设定时间后,抛出找不到元素异常 即,当元素没 ...

  8. CSS换行:word-wrap、word-break和text-wrap区别

    一.word-wrap:允许对长的不可分割的单词进行分割并换行到下一行.(中英文处理效果一样) word-wrap有两个取值: 1.word-wrap: normal:只在允许的断字点换行(浏览器保持 ...

  9. bzoj 2656 [Zjoi2012]数列(sequence)(高精度)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2656 [题意] 计算大数递推式 [思路] 高精度 [代码] #include<c ...

  10. dateline 在数据库中就是 整型字段。date函数是可以转换成可读日期的。

    返回数据中的dateline全部用date()函数转换后再返回,是要嵌套循环还是遍历,代码怎么写? //查询我的活动 function user_activity_info_by_uid($uid){ ...