前面写了一个Pointer2Draw的小程序。这个程序的神奇之处在于,你永远也别想绘制出任何东西。原因是根本没有所谓 的0x00000107。下面看看如何正确的处理多点触摸,光靠event.getAction()吃饭的时代已经终结了……
(1)获得屏幕上的Pointer的数目:
- int pointerCount = 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;
- }
- float x = event.getX(pointerId);//获得第二个手指的坐标
- float y = event.getY(pointerId);
- 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来改善我们的代码:
- 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;
- }
- }