前面写了一个Pointer2Draw的小程序。这个程序的神奇之处在于,你永远也别想绘制出任何东西。原因是根本没有所谓 的0x00000107。下面看看如何正确的处理多点触摸,光靠event.getAction()吃饭的时代已经终结了……
(1)获得屏幕上的Pointer的数目:
- intpointerCount=event.getPointerCount();
(2)得到手指的ID:Android提供了两个掩码方便我们操作ACTION_POINTER_ID_MASK 0x0000ff00,和ACTION_POINTER_ID_SHIFT 0x00000008。
- if(pointerCount>1){
- pointerId=(action&MotionEvent.ACTION_POINTER_ID_MASK)>>>
- MotionEvent.ACTION_POINTER_ID_SHIFT;
- }
- floatx=event.getX(pointerId);//获得第二个手指的坐标
- floaty=event.getY(pointerId);
- publicbooleanonTouchEvent(MotionEventevent){
- intpointerCount=event.getPointerCount();
- intpointerId=0;
- intaction=event.getAction();
- if(pointerCount>1){
- pointerId=(action&MotionEvent.ACTION_POINTER_ID_MASK)>>>
- MotionEvent.ACTION_POINTER_ID_SHIFT;
- }
- floatx=0;
- floaty=0;
- if(pointerId==1){
- x=event.getX(pointerId);
- y=event.getY(pointerId);
- canvas.drawPoint(x,y,paint);
- imgView.invalidate();
- }
- returntrue;
- }
注意手指的ID是从0开始的,所以第二个手指的ID是1;然而遗憾的是程序只有在第二个手指DOWN和UP时才绘制。当第一个手指不动时,根本没有有效的方法对第二个手指的移动做出反应。然而触摸屏是很敏感的,你发现很难让它不产生ACTION_MOVE。我们利用Android提供的ACTION_MASK 0x000000ff来改善我们的代码:
- publicclassPointer2DrawActivityextendsActivityimplementsOnTouchListener{
- /**Calledwhentheactivityisfirstcreated.*/
- ImageViewimgView;
- Bitmapbitmap;
- Canvascanvas;
- Paintpaint;
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- imgView=(ImageView)findViewById(R.id.imgView);
- DisplaycurrentDisplay=getWindowManager().getDefaultDisplay();
- floatdw=currentDisplay.getWidth();
- floatdh=currentDisplay.getHeight();
- bitmap=Bitmap.createBitmap((int)dw,(int)dh,Config.ARGB_8888);
- canvas=newCanvas(bitmap);
- paint=newPaint();
- paint.setColor(Color.GREEN);
- paint.setStrokeWidth((float)10.00);//设置笔刷大小,自己的屏幕太犀利了
- imgView.setImageBitmap(bitmap);
- imgView.setOnTouchListener(this);
- }
- @Override
- publicbooleanonTouch(Viewv,MotionEventevent){
- intpointerCount=event.getPointerCount();
- intpointerId=0;
- intaction=(event.getAction()&MotionEvent.ACTION_MASK)%5;//统一单点和多点
- switch(action){
- caseMotionEvent.ACTION_DOWN:
- if(pointerCount>1){
- pointerId=(event.getAction()&MotionEvent.ACTION_POINTER_ID_MASK)>>>
- MotionEvent.ACTION_POINTER_ID_SHIFT;
- }
- break;
- caseMotionEvent.ACTION_MOVE:
- if(pointerCount==2){
- floatx=event.getX(1);
- floaty=event.getY(1);
- canvas.drawPoint((int)x,(int)y,paint);
- imgView.invalidate();
- }
- break;
- caseMotionEvent.ACTION_UP:
- break;
- }
- returntrue;
- }
- }
本文介绍了一款名为Pointer2Draw的应用程序,该程序能够通过正确处理多点触摸事件实现在屏幕上绘制的功能。文章详细解释了如何获取触摸点的数量、ID及坐标,并展示了如何使用Android提供的API来区分不同手指的动作。
8万+

被折叠的 条评论
为什么被折叠?



