天天看点

双击检测

上一篇的内容使用到了Matrix来进行图像的放大 或者缩小以及移动。感觉对这个类了解甚少,今天就粗略了解一些。

首先列出上一篇文章使用过的Matrix类的主要方法:

  1. public void set(Matrix src)
  2. public void getValues(float[] values)
  3. public boolean postScale(float sx, float sy, float px, float py)
  4. public boolean postTranslate(float dx, float dy)

    Matrix是一个3X3矩阵,每一个元素都代表一定的几何意义,如移动,放大 等 。源代码中给出了 这九个元素的定义

public static final int MSCALE_X = ;   //!< use with getValues/setValues
    public static final int MSKEW_X  = ;   //!< use with getValues/setValues
    public static final int MTRANS_X = ;   //!< use with getValues/setValues
    public static final int MSKEW_Y  = ;   //!< use with getValues/setValues
    public static final int MSCALE_Y = ;   //!< use with getValues/setValues
    public static final int MTRANS_Y = ;   //!< use with getValues/setValues
    public static final int MPERSP_0 = ;   //!< use with getValues/setValues
    public static final int MPERSP_1 = ;   //!< use with getValues/setValues
    public static final int MPERSP_2 = ;   //!< use with getValues/setValues
           

其中MSCALE_X 是x轴放大属性,MTRANS_X为x轴的位置属性。同理y轴也 具有相同的属性。我们可以将这些元素搞到一个数组中,然后进行访问:

Matrix mMatrix = new Matrix();
float[] values = new  float[];
mMatrix.getValues(values);
if(scale*values[Matrix.MSCALE_X]>)
    scale = scale/values[Matrix.MSCALE_X];
           

上面已经列举了几个常用的method,其中public void set(Matrix src) 是利用src矩阵初始化一个矩阵,如果src矩阵为null,则reset(0)原矩阵。public boolean postScale(float sx, float sy, float px, float py)方法则对于位置和放大参数都进行了设置,但参数的更改都是在调用 此方法的矩阵基础上进行的,调用setScale(float sx, float sy, float px, float py)则是会出现从右上角重新开始进行变化,此处我的理解是他不会理睬调用它的矩阵,直接从最初的矩阵开始变化的。public boolean postTranslate(float dx, float dy)与public boolean setTranslate(float dx, float dy)也具有此等关系的。

现在明白了Matrix矩阵作为图片transition的工具的一些性质,下面实现双击恢复图片原有大小功能。

每个组件都有自己的onTouchEvent事件,因此你需要在自己的类中定义一个检测器

private GestureDetector mGestureDetector;
           

并在oncreate方法 中进行初始化:

mGestureDetector = new GestureDetector(this,new GestureListener());
           

这里GestureListener是你自己写的内部类,来执行和确定已执行的action。

private class GestureListener extends GestureDetector.SimpleOnGestureListener {
       // private Photo listener;

        public GestureListener() {
            super();
        }

        @Override
        public boolean onContextClick(MotionEvent e) {
            return super.onContextClick(e);
        }

        @Override
        public boolean onDoubleTapEvent(MotionEvent e) {
            return super.onDoubleTapEvent(e);
        }

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            return super.onSingleTapConfirmed(e);
        }

        @Override
        public boolean onDoubleTap(MotionEvent e) {
            onDoubleClick();
            return true;
        }

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }

        @Override
        public void onShowPress(MotionEvent e) {
            super.onShowPress(e);
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            return super.onFling(e1, e2, velocityX, velocityY);
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            return super.onScroll(e1, e2, distanceX, distanceY);
        }

        @Override
        public void onLongPress(MotionEvent e) {
            super.onLongPress(e);
        }

        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            return super.onSingleTapUp(e);
        }
    }
           

写一个方法执行图形恢复原状动作,此处方法不唯一:

void onDoubleClick() {
          float[] values = new float[] {
                ,,,
                ,,,
                ,,
        };
        rawMatrix.setValues(values);

        photo.setImageMatrix(rawMatrix);
    }
           

在 public boolean onTouch(View v, MotionEvent event) 方法中,最后返回值改为

return mGestureDetector.onTouchEvent(event);
           

这样就可以啦。