android多点触控统一的原理(使用 event.getAction()&MotionEvent.ACTION_MASK的原因)

来源:互联网 发布:知世故而不世故原句 编辑:程序博客网 时间:2024/05/17 03:32

看到下面代码中用了AND位运算是为了什么呢?

public boolean onTouchEvent(MotionEvent event) {int action = event.getAction();switch (action & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN:showMsg("ACTION_DOWN" + action);break;case MotionEvent.ACTION_UP:showMsg("ACTION_UP" + action);break;case MotionEvent.ACTION_POINTER_UP:showMsg("ACTION_POINTER_UP" + action);break;case MotionEvent.ACTION_POINTER_DOWN:showMsg("ACTION_POINTER_DOWN" + action);break;}return super.onTouchEvent(event);}

首先来看看这些常量的值

ACTION_MASK     0x000000ffACTION_DOWN     0x00000000         ACTION_UP      0x00000001        ACTION_MOVE      0x00000002ACTION_POINTER_DOWN       0x00000005            ACTION_POINTER_UP        0x00000006ACTION_POINTER_1_DOWN     0x00000005            ACTION_POINTER_1_UP      0x00000006ACTION_POINTER_2_DOWN     0x00000105            ACTION_POINTER_2_UP      0x00000106


例如:ACTION_MASK & ACTION_POINTER_2_DOWN 即0x000000ff & 0×00000105=0x0000005

可以看到,and运算的结果总是小于等于0x000000ff,那就是说and之后,无论你多少根手指加进来,都是会ACTION_POINTER_DOWN或者ACTION_POINTER_UP


imgitem.setOnTouchListener(new OnTouchListener() {            PointF start = new PointF();            PointF mid = new PointF();            float oldDist = 1f;            Matrix matrix = new Matrix();            Matrix savedMatrix = new Matrix();            static final int NONE = 0;            static final int DRAG = 1;            static final int ZOOM = 2;            int mode = NONE;            long startTime;            public boolean onTouch(View v, MotionEvent event) {                ImageView view = (ImageView) v;                view.setScaleType(ScaleType.MATRIX);                switch (event.getAction() & MotionEvent.ACTION_MASK) {                case MotionEvent.ACTION_DOWN:                    matrix.set(view.getImageMatrix());                    savedMatrix.set(matrix);                    start.set(event.getX(), event.getY());                    mode = DRAG;                    // isclick = true;                    startTime = System.currentTimeMillis();                    break;                case MotionEvent.ACTION_POINTER_DOWN:                    // isclick = false;                    oldDist = spacing(event);                    if (oldDist > 10f) {                        savedMatrix.set(matrix);                        midPoint(mid, event);                        mode = ZOOM;                    }                    break;                case MotionEvent.ACTION_UP:                    /*if (mode == DRAG && System.currentTimeMillis() - startTime < 150) {                        finish();                        overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);                    }*/                    break;                case MotionEvent.ACTION_POINTER_UP:                    mode = NONE;                    break;                case MotionEvent.ACTION_MOVE:                    // isclick = false;                    if (mode == DRAG) {                        matrix.set(savedMatrix);                        matrix.postTranslate(event.getX() - start.x, event.getY() - start.y);                    } else if (mode == ZOOM) {                        float newDist = spacing(event);                        if (newDist > 10f) {                            matrix.set(savedMatrix);                            float scale = newDist / oldDist;                            matrix.postScale(scale, scale, mid.x, mid.y);                        }                    }                    break;                }                view.setImageMatrix(matrix);                return true;            }            private float spacing(MotionEvent event) {                float x = event.getX(0) - event.getX(1);                float y = event.getY(0) - event.getY(1);                return FloatMath.sqrt(x * x + y * y);            }            private void midPoint(PointF point, MotionEvent event) {                float x = event.getX(0) + event.getX(1);                float y = event.getY(0) + event.getY(1);                point.set(x / 2, y / 2);            }        });


2 0