import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
public class MainActivity extends Activity {
ImageView imageView;
private PointF startPoint = new PointF();
private Matrix matrix = new Matrix();
private Matrix currentMaritx = new Matrix();
boolean firstTimeZoom = true;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageView = (ImageView) findViewById(R.id.imageView);
imageView.setOnTouchListener(new TounchListener());
}
private class TounchListener implements OnTouchListener {
private int mode = 0;// 用于标记模式
private static final int DRAG = 1;// 拖动
private static final int ZOOM = 2;// 放大
private float startDis = 0;
// private PointF midPoint;// 中心点
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
mode = DRAG;
imageView.setScaleType(ImageView.ScaleType.MATRIX);//设置ImageView的缩放模式为矩阵缩放
currentMaritx.set(imageView.getImageMatrix());// 记录ImageView当期的移动位置
if(firstTimeZoom){
currentMaritx.postScale(1, 1);
firstTimeZoom = false;
}
startPoint.set(event.getX(), event.getY());// 开始点
break;
case MotionEvent.ACTION_MOVE:// 移动事件
if (mode == DRAG) {// 图片拖动事件
float dx = event.getX() - startPoint.x;// x轴移动距离
float dy = event.getY() - startPoint.y;
matrix.set(currentMaritx);// 在当前的位置基础上移动
matrix.postTranslate(dx, dy);
} else if (mode == ZOOM) {// 图片放大事件
float endDis = distance(event);// 结束距离
if (endDis > 10f) {
float scale = endDis / startDis;// 放大倍数
matrix.set(currentMaritx);
float currentX = imageView.getWidth() / 2;
float currentY = imageView.getHeight() / 2;
matrix.postScale(scale, scale, currentX, currentY);
}
}
break;
case MotionEvent.ACTION_UP:
mode = 0;
break;
// 有手指离开屏幕,但屏幕还有触点(手指)
case MotionEvent.ACTION_POINTER_UP:
mode = 0;
break;
// 当屏幕上已经有触点(手指),再有一个手指压下屏幕
case MotionEvent.ACTION_POINTER_DOWN:
mode = ZOOM;
startDis = distance(event);
if (startDis > 10f) {// 避免手指上有两个茧
// midPoint = mid(event);
currentMaritx.set(imageView.getImageMatrix());// 记录当前的缩放倍数
}
break;
}
// Log.i("x", "");
imageView.setImageMatrix(matrix);
return true;
}
}
/**
* 两点之间的距离
*
* @param event
* @return
*/
private static float distance(MotionEvent event) {
// 两根线的距离
float dx = event.getX(1) - event.getX(0);
float dy = event.getY(1) - event.getY(0);
return FloatMath.sqrt(dx * dx + dy * dy);
}
/**
* 计算两点之间中心点的距离
*
* @param event
* @return
*/
// private static PointF mid(MotionEvent event) {
// float midx = event.getX(1) + event.getX(0);
// float midy = event.getY(1) - event.getY(0);
// return new PointF(midx / 2, midy / 2);
// }
}
这个例子做的还不够完整,有一些功能没有实现,而且有时还会出现一些bug。
我是用安卓2.3.5版本测试的,如果在onCreate方法中设置图片的初始缩放为比例为1的话,并不能产生效果,只有把缩放语句放在onTouch方法里才会有效,不太理解是怎么原理,希望大家能给些意见。
如果想了解ImageView的属性android:scaleType作用,可以去看大神的博客,地址为 http://blog.youkuaiyun.com/dyllove98/article/details/8827697
代码下载地址为 http://download.youkuaiyun.com/detail/u012251822/6389653