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

首先Android开发网提醒大家多点触控需要LCD驱动和应用软件两个支持才能实现,所以部分比较老的,比如Android 2.1以前或在北美上市的手机可能无法支持多点触控在固件上,由于Apple专利原因在欧洲和亚太地区的Android 2.1以后的新款机型固件均已经在屏幕驱动中支持,同时模拟器也无法实现多点触控的测试。

下面Android123一起用Android 2.0或以上SDK中的方法来实现如何通过应用层支持多点触控操作,对于常规的控件触控操作在内部为View的setOnTouchListener()接口实现的onTouchEvent()方法来处理。对于onTouchEvent方法的参数MotionEvent我们可以详细处理来实现对多点触控的了解,比如

event.getAction() //获取触控动作比如ACTION_DOWN
event.getPointerCount(); //获取触控点的数量,比如2则可能是两个手指同时按压屏幕
event.getPointerId(nID); //对于每个触控的点的细节,我们可以通过一个循环执行getPointerId方法获取索引
event.getX(nID); //获取第nID个触控点的x位置
event.getY(nID); //获取第nID个点触控的y位置
event.getPressure(nID); //LCD可以感应出用户的手指压力,当然具体的级别由驱动和物理硬件决定的

event.getDownTime() //按下开始时间

event.getEventTime() // 事件结束时间

event.getEventTime()-event.getDownTime()); //总共按下时花费时间

有关Android多点触控的更详细技术由于目前兼容性和固件问题android123将会在以后的内容中详细讨论,这里给大家起到抛砖引玉的作用。

实例:
Java代码
  1. packagecom.ideasandroid.demo;
  2. importandroid.content.Context;
  3. importandroid.graphics.Canvas;
  4. importandroid.graphics.Color;
  5. importandroid.graphics.Paint;
  6. importandroid.view.MotionEvent;
  7. importandroid.view.SurfaceHolder;
  8. importandroid.view.SurfaceView;
  9. publicclassMTViewextendsSurfaceViewimplementsSurfaceHolder.Callback{
  10. privatestaticfinalintMAX_TOUCHPOINTS=10;
  11. privatestaticfinalStringSTART_TEXT="请随便触摸屏幕进行测试";
  12. privatePainttextPaint=newPaint();
  13. privatePainttouchPaints[]=newPaint[MAX_TOUCHPOINTS];
  14. privateintcolors[]=newint[MAX_TOUCHPOINTS];
  15. privateintwidth,height;
  16. privatefloatscale=1.0f;
  17. publicMTView(Contextcontext){
  18. super(context);
  19. SurfaceHolderholder=getHolder();
  20. holder.addCallback(this);
  21. setFocusable(true);//确保我们的View能获得输入焦点
  22. setFocusableInTouchMode(true);//确保能接收到触屏事件
  23. init();
  24. }
  25. privatevoidinit(){
  26. //初始化10个不同颜色的画笔
  27. textPaint.setColor(Color.WHITE);
  28. colors[0]=Color.BLUE;
  29. colors[1]=Color.RED;
  30. colors[2]=Color.GREEN;
  31. colors[3]=Color.YELLOW;
  32. colors[4]=Color.CYAN;
  33. colors[5]=Color.MAGENTA;
  34. colors[6]=Color.DKGRAY;
  35. colors[7]=Color.WHITE;
  36. colors[8]=Color.LTGRAY;
  37. colors[9]=Color.GRAY;
  38. for(inti=0;i<MAX_TOUCHPOINTS;i++){
  39. touchPaints[i]=newPaint();
  40. touchPaints[i].setColor(colors[i]);
  41. }
  42. }
  43. /*
  44. *处理触屏事件
  45. */
  46. @Override
  47. publicbooleanonTouchEvent(MotionEventevent){
  48. //获得屏幕触点数量
  49. intpointerCount=event.getPointerCount();
  50. if(pointerCount>MAX_TOUCHPOINTS){
  51. pointerCount=MAX_TOUCHPOINTS;
  52. }
  53. //锁定Canvas,开始进行相应的界面处理
  54. Canvasc=getHolder().lockCanvas();
  55. if(c!=null){
  56. c.drawColor(Color.BLACK);
  57. if(event.getAction()==MotionEvent.ACTION_UP){
  58. //当手离开屏幕时,清屏
  59. }else{
  60. //先在屏幕上画一个十字,然后画一个圆
  61. for(inti=0;i<pointerCount;i++){
  62. //获取一个触点的坐标,然后开始绘制
  63. intid=event.getPointerId(i);
  64. intx=(int)event.getX(i);
  65. inty=(int)event.getY(i);
  66. drawCrosshairsAndText(x,y,touchPaints[id],i,id,c);
  67. }
  68. for(inti=0;i<pointerCount;i++){
  69. intid=event.getPointerId(i);
  70. intx=(int)event.getX(i);
  71. inty=(int)event.getY(i);
  72. drawCircle(x,y,touchPaints[id],c);
  73. }
  74. }
  75. //画完后,unlock
  76. getHolder().unlockCanvasAndPost(c);
  77. }
  78. returntrue;
  79. }
  80. /**
  81. *画十字及坐标信息
  82. *
  83. *@paramx
  84. *@paramy
  85. *@parampaint
  86. *@paramptr
  87. *@paramid
  88. *@paramc
  89. */
  90. privatevoiddrawCrosshairsAndText(intx,inty,Paintpaint,intptr,
  91. intid,Canvasc){
  92. c.drawLine(0,y,width,y,paint);
  93. c.drawLine(x,0,x,height,paint);
  94. inttextY=(int)((15+20*ptr)*scale);
  95. c.drawText("x"+ptr+"="+x,10*scale,textY,
  96. c.drawText("y"+ptr+"="+y,70*scale,textY,
  97. c.drawText("id"+ptr+"="+id,width-55*sc
  98. }
  99. /**
  100. *画圆
  101. *
  102. *@paramx
  103. *@paramy
  104. *@parampaint
  105. *@paramc
  106. */
  107. privatevoiddrawCircle(intx,inty,Paintpaint,Canvasc
  108. c.drawCircle(x,y,40*scale,paint);
  109. }
  110. /*
  111. *进入程序时背景画成黑色,然后把“START_TEXT”写到屏幕
  112. */
  113. publicvoidsurfaceChanged(SurfaceHolderholder,intformat,i
  114. intheight){
  115. this.width=width;
  116. this.height=height;
  117. if(width>height){
  118. this.scale=width/480f;
  119. }else{
  120. this.scale=height/480f;
  121. }
  122. textPaint.setTextSize(14*scale);
  123. Canvasc=getHolder().lockCanvas();
  124. if(c!=null){
  125. //背景黑色
  126. c.drawColor(Color.BLACK);
  127. floattWidth=textPaint.measureText(START_TEXT);
  128. c.drawText(START_TEXT,width/2-tWidth/2
  129. textPaint);
  130. getHolder().unlockCanvasAndPost(c);
  131. }
  132. }
  133. publicvoidsurfaceCreated(SurfaceHolderholder){
  134. }
  135. publicvoidsurfaceDestroyed(SurfaceHolderholder){
  136. }
  137. }

Activity:
Java代码
  1. packagecom.ideasandroid.demo;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.view.Window;
  5. importandroid.view.WindowManager;
  6. publicclassMultitouchVisibleextendsActivity{
  7. @Override
  8. publicvoidonCreate(BundlesavedInstanceState){
  9. super.onCreate(savedInstanceState);
  10. //隐藏标题栏
  11. requestWindowFeature(Window.FEATURE_NO_TITLE);
  12. //设置成全屏
  13. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  14. WindowManager.LayoutParams.FLAG_FULLSCREEN);
  15. //设置为上面的MTView
  16. setContentView(newMTView(this));
  17. }
  18. }

更多相关文章

  1. 开始折腾ipad mini 3
  2. Android(安卓)获取ROOT权限原理解析
  3. Android引路蜂地图开发示例:概述
  4. android获取正在运行的应用程序
  5. Android(安卓)蓝牙开发基本流程
  6. DIY Android之一--原生Android系统主题支持的设计和实现
  7. Android(安卓)solve设备(手机)旋转过程中出现程序中断问题
  8. 使用Android内部的DownloadProvider下载文件,并获取cache权限
  9. android之文件上传

随机推荐

  1. android中遇到问题总结
  2. Android(安卓)Wear 数据类型和接口的发送
  3. Android Studio安装后Gradle同步失败问题
  4. [Android]Android字体高度的研究
  5. Mac 安装 Android Studio
  6. 微信Android客户端后台保活经验分享
  7. android基础之RelativeLayout布局
  8. Android Log日志保存到本地并读取
  9. 【iOS-cocos2d-X 游戏开发之十三】详细讲
  10. 拥抱Android(安卓)Studio:从ADT到Android(