上一篇的内容使用到了Matrix来进行图像的放大 或者缩小以及移动。感觉对这个类了解甚少,今天就粗略了解一些。
首先列出上一篇文章使用过的Matrix类的主要方法:
- public void set(Matrix src)
- public void getValues(float[] values)
- public boolean postScale(float sx, float sy, float px, float py)
-
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);
这样就可以啦。