多点触碰2

本文介绍了一款名为Pointer2Draw的应用程序,该程序能够通过正确处理多点触摸事件实现在屏幕上绘制的功能。文章详细解释了如何获取触摸点的数量、ID及坐标,并展示了如何使用Android提供的API来区分不同手指的动作。

前面写了一个Pointer2Draw的小程序。这个程序的神奇之处在于,你永远也别想绘制出任何东西。原因是根本没有所谓 的0x00000107。下面看看如何正确的处理多点触摸,光靠event.getAction()吃饭的时代已经终结了……

(1)获得屏幕上的Pointer的数目:

  1. intpointerCount=event.getPointerCount();
int pointerCount = event.getPointerCount(); 这个函数具体返回值受到物理设备的限制,我费了很大力气将十个手指放到了我的手机上,得到的结果仍然是8

(2)得到手指的ID:Android提供了两个掩码方便我们操作ACTION_POINTER_ID_MASK 0x0000ff00,ACTION_POINTER_ID_SHIFT 0x00000008。

  1. if(pointerCount>1){
  2. pointerId=(action&MotionEvent.ACTION_POINTER_ID_MASK)>>>
  3. MotionEvent.ACTION_POINTER_ID_SHIFT;
  4. }
if(pointerCount>1){ pointerId = (action & MotionEvent.ACTION_POINTER_ID_MASK)>>> MotionEvent.ACTION_POINTER_ID_SHIFT; } (3)利用ID获得坐标信息:
  1. floatx=event.getX(pointerId);//获得第二个手指的坐标
  2. floaty=event.getY(pointerId);
float x = event.getX(pointerId);//获得第二个手指的坐标 float y = event.getY(pointerId); 下面终于可以让Pointer2Draw运行起来了。
  1. publicbooleanonTouchEvent(MotionEventevent){
  2. intpointerCount=event.getPointerCount();
  3. intpointerId=0;
  4. intaction=event.getAction();
  5. if(pointerCount>1){
  6. pointerId=(action&MotionEvent.ACTION_POINTER_ID_MASK)>>>
  7. MotionEvent.ACTION_POINTER_ID_SHIFT;
  8. }
  9. floatx=0;
  10. floaty=0;
  11. if(pointerId==1){
  12. x=event.getX(pointerId);
  13. y=event.getY(pointerId);
  14. canvas.drawPoint(x,y,paint);
  15. imgView.invalidate();
  16. }
  17. returntrue;
  18. }
public boolean onTouchEvent(MotionEvent event){ int pointerCount = event.getPointerCount(); int pointerId = 0; int action = event.getAction(); if(pointerCount>1){ pointerId = (action & MotionEvent.ACTION_POINTER_ID_MASK)>>> MotionEvent.ACTION_POINTER_ID_SHIFT; } float x = 0; float y = 0; if(pointerId == 1){ x = event.getX(pointerId); y = event.getY(pointerId); canvas.drawPoint(x, y, paint); imgView.invalidate(); } return true; }

注意手指的ID是从0开始的,所以第二个手指的ID是1;然而遗憾的是程序只有在第二个手指DOWN和UP时才绘制。当第一个手指不动时,根本没有有效的方法对第二个手指的移动做出反应。然而触摸屏是很敏感的,你发现很难让它不产生ACTION_MOVE。我们利用Android提供的ACTION_MASK 0x000000ff来改善我们的代码:

  1. publicclassPointer2DrawActivityextendsActivityimplementsOnTouchListener{
  2. /**Calledwhentheactivityisfirstcreated.*/
  3. ImageViewimgView;
  4. Bitmapbitmap;
  5. Canvascanvas;
  6. Paintpaint;
  7. @Override
  8. publicvoidonCreate(BundlesavedInstanceState){
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.main);
  11. imgView=(ImageView)findViewById(R.id.imgView);
  12. DisplaycurrentDisplay=getWindowManager().getDefaultDisplay();
  13. floatdw=currentDisplay.getWidth();
  14. floatdh=currentDisplay.getHeight();
  15. bitmap=Bitmap.createBitmap((int)dw,(int)dh,Config.ARGB_8888);
  16. canvas=newCanvas(bitmap);
  17. paint=newPaint();
  18. paint.setColor(Color.GREEN);
  19. paint.setStrokeWidth((float)10.00);//设置笔刷大小,自己的屏幕太犀利了
  20. imgView.setImageBitmap(bitmap);
  21. imgView.setOnTouchListener(this);
  22. }
  23. @Override
  24. publicbooleanonTouch(Viewv,MotionEventevent){
  25. intpointerCount=event.getPointerCount();
  26. intpointerId=0;
  27. intaction=(event.getAction()&MotionEvent.ACTION_MASK)%5;//统一单点和多点
  28. switch(action){
  29. caseMotionEvent.ACTION_DOWN:
  30. if(pointerCount>1){
  31. pointerId=(event.getAction()&MotionEvent.ACTION_POINTER_ID_MASK)>>>
  32. MotionEvent.ACTION_POINTER_ID_SHIFT;
  33. }
  34. break;
  35. caseMotionEvent.ACTION_MOVE:
  36. if(pointerCount==2){
  37. floatx=event.getX(1);
  38. floaty=event.getY(1);
  39. canvas.drawPoint((int)x,(int)y,paint);
  40. imgView.invalidate();
  41. }
  42. break;
  43. caseMotionEvent.ACTION_UP:
  44. break;
  45. }
  46. returntrue;
  47. }
  48. }
public class Pointer2DrawActivity extends Activity implements OnTouchListener{ /** Called when the activity is first created. */ ImageView imgView; Bitmap bitmap; Canvas canvas; Paint paint; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); imgView = (ImageView)findViewById(R.id.imgView); Display currentDisplay = getWindowManager().getDefaultDisplay(); float dw = currentDisplay.getWidth(); float dh = currentDisplay.getHeight(); bitmap = Bitmap.createBitmap((int)dw, (int)dh, Config.ARGB_8888); canvas = new Canvas(bitmap); paint = new Paint(); paint.setColor(Color.GREEN); paint.setStrokeWidth((float) 10.00);//设置笔刷大小,自己的屏幕太犀利了 imgView.setImageBitmap(bitmap); imgView.setOnTouchListener(this); } @Override public boolean onTouch(View v, MotionEvent event) { int pointerCount = event.getPointerCount(); int pointerId = 0; int action = (event.getAction()&MotionEvent.ACTION_MASK) % 5;//统一单点和多点 switch(action){ case MotionEvent.ACTION_DOWN: if(pointerCount>1){ pointerId = (event.getAction()&MotionEvent.ACTION_POINTER_ID_MASK)>>> MotionEvent.ACTION_POINTER_ID_SHIFT; } break; case MotionEvent.ACTION_MOVE: if(pointerCount == 2){ float x = event.getX(1); float y = event.getY(1); canvas.drawPoint((int)x, (int)y, paint); imgView.invalidate(); } break; case MotionEvent.ACTION_UP: break; } return true; } }好了,Pointer2Draw终于按照想要的方式运行了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值