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将会在以后的内容中详细讨论,这里给大家起到抛砖引玉的作用。

实例:
package com.ideasandroid.demo;     import android.content.Context;  import android.graphics.Canvas;  import android.graphics.Color;  import android.graphics.Paint;  import android.view.MotionEvent;  import android.view.SurfaceHolder;  import android.view.SurfaceView;     public class MTView extends SurfaceView implements SurfaceHolder.Callback {         private static final int MAX_TOUCHPOINTS = 10;      private static final String START_TEXT = "请随便触摸屏幕进行测试";      private Paint textPaint = new Paint();      private Paint touchPaints[] = new Paint[MAX_TOUCHPOINTS];      private int colors[] = new int[MAX_TOUCHPOINTS];         private int width, height;      private float scale = 1.0f;         public MTView(Context context) {          super(context);          SurfaceHolder holder = getHolder();          holder.addCallback(this);          setFocusable(true); // 确保我们的View能获得输入焦点          setFocusableInTouchMode(true); // 确保能接收到触屏事件          init();      }         private void init() {          // 初始化10个不同颜色的画笔          textPaint.setColor(Color.WHITE);          colors[0] = Color.BLUE;          colors[1] = Color.RED;          colors[2] = Color.GREEN;          colors[3] = Color.YELLOW;          colors[4] = Color.CYAN;          colors[5] = Color.MAGENTA;          colors[6] = Color.DKGRAY;          colors[7] = Color.WHITE;          colors[8] = Color.LTGRAY;          colors[9] = Color.GRAY;          for (int i = 0; i < MAX_TOUCHPOINTS; i++) {              touchPaints[i] = new Paint();              touchPaints[i].setColor(colors[i]);          }      }         /*       * 处理触屏事件       */      @Override      public boolean onTouchEvent(MotionEvent event) {          // 获得屏幕触点数量          int pointerCount = event.getPointerCount();          if (pointerCount > MAX_TOUCHPOINTS) {              pointerCount = MAX_TOUCHPOINTS;          }          // 锁定Canvas,开始进行相应的界面处理          Canvas c = getHolder().lockCanvas();          if (c != null) {              c.drawColor(Color.BLACK);              if (event.getAction() == MotionEvent.ACTION_UP) {                  // 当手离开屏幕时,清屏              } else {                  // 先在屏幕上画一个十字,然后画一个圆                  for (int i = 0; i < pointerCount; i++) {                      // 获取一个触点的坐标,然后开始绘制                      int id = event.getPointerId(i);                      int x = (int) event.getX(i);                      int y = (int) event.getY(i);                      drawCrosshairsAndText(x, y, touchPaints[id], i, id, c);                  }                  for (int i = 0; i < pointerCount; i++) {                      int id = event.getPointerId(i);                      int x = (int) event.getX(i);                      int y = (int) event.getY(i);                      drawCircle(x, y, touchPaints[id], c);                  }              }              // 画完后,unlock              getHolder().unlockCanvasAndPost(c);          }          return true;      }         /**       * 画十字及坐标信息       *       * @param x       * @param y       * @param paint       * @param ptr       * @param id       * @param c       */      private void drawCrosshairsAndText(int x, int y, Paint paint, int ptr,              int id, Canvas c) {          c.drawLine(0, y, width, y, paint);          c.drawLine(x, 0, x, height, paint);          int textY = (int) ((15 + 20 * ptr) * scale);          c.drawText("x" + ptr + "=" + x, 10 * scale, textY,        c.drawText("y" + ptr + "=" + y, 70 * scale, textY,        c.drawText("id" + ptr + "=" + id, width - 55 * sc    }         /**       * 画圆       *       * @param x       * @param y       * @param paint       * @param c       */      private void drawCircle(int x, int y, Paint paint, Canvas c        c.drawCircle(x, y, 40 * scale, paint);      }         /*       * 进入程序时背景画成黑色,然后把“START_TEXT”写到屏幕       */      public void surfaceChanged(SurfaceHolder holder, int format, i            int height) {          this.width = width;          this.height = height;          if (width > height) {              this.scale = width / 480f;          } else {              this.scale = height / 480f;          }          textPaint.setTextSize(14 * scale);          Canvas c = getHolder().lockCanvas();          if (c != null) {              // 背景黑色              c.drawColor(Color.BLACK);              float tWidth = textPaint.measureText(START_TEXT);            c.drawText(START_TEXT, width / 2 - tWidth / 2                    textPaint);              getHolder().unlockCanvasAndPost(c);          }      }         public void surfaceCreated(SurfaceHolder holder) {      }         public void surfaceDestroyed(SurfaceHolder holder) {      }     }  

Activity:
package com.ideasandroid.demo;     import android.app.Activity;  import android.os.Bundle;  import android.view.Window;  import android.view.WindowManager;     public class MultitouchVisible extends Activity {      @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          //隐藏标题栏          requestWindowFeature(Window.FEATURE_NO_TITLE);          //设置成全屏          getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,                  WindowManager.LayoutParams.FLAG_FULLSCREEN);          //设置为上面的MTView          setContentView(new MTView(this));      }  } 

更多相关文章

  1. 《Android经验分享》周刊第6期
  2. android通过反射获取内置外置存储器列表
  3. Android(安卓)操作系统 获取Root权限 原理解析
  4. 关于Android的多种屏幕适配
  5. Android仿人人客户端(v5.7.1)——个人主页(一)
  6. Android中获取文本宽度和高度
  7. Android(安卓)中,应用程序需要的图片资源如何针对不同屏幕大小手
  8. android zbar二维码扫描(中文不乱码)
  9. Android中的URI 和Uri

随机推荐

  1. Android简单修改原有应用和添加应用的方
  2. 【Android】界面布局之 LinearLayout(线
  3. 谷歌官方Android应用架构库(Android Archi
  4. 如何自学Android编程——Android自学资料
  5. Android原生开发、H5、React-Native之间
  6. 光学识别信用卡阅读器Card.io终于发布And
  7. Android netd和Framework以及netd和kerne
  8. Android 初始化ini.rc中启动zygote服务
  9. android @id和@+id的区别
  10. Java乔晓松-android中获取图片的缩略图(