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 { private ImageView meImageView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); initView(); } /** * 初始化 View * * @date 2012-3-2 下午10:35:28 */ private void initView() { meImageView = (ImageView) findViewById(R.id.iv_me);//放图片的ImageView meImageView.setOnTouchListener(new myTouchListener());//为图片设置监听 } /** * 处理触摸事件 * @author 小袁 * @date 2012-3-2 下午10:38:36 */ private class myTouchListener implements OnTouchListener { private PointF startPoint = new PointF();//移动前手指点击的坐标 private PointF midPoint = new PointF();//移动前手指点击的坐标 private Matrix matrix = new Matrix();//矩阵 private Matrix currentMatrix = new Matrix();//每次缩放前都需要存储当前的矩阵 private final static int DRAG = 1;//移动的标志 private final static int ZOOM = 1;//缩放的标志 private int type = 0;//代表当前状态 private float startDist = 0;//开始时的距离 @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub switch (event.getAction() & MotionEvent.ACTION_MASK) {//屏蔽掉高8位 因为没用 可能会提高效率 case MotionEvent.ACTION_DOWN://一个手指按下事件 startPoint.set(event.getX(),event.getY());//起点的坐标 currentMatrix.set(matrix);//每一次存储当前的矩阵 type = DRAG;//这个代表移动 break; case MotionEvent.ACTION_MOVE: if ( type == DRAG) {//如果是移动的事件 float dx = event.getX() - startPoint.x;//x轴移动的距离 float dy = event.getY() - startPoint.y;//y轴移动的距离 matrix.set(currentMatrix); matrix.postTranslate(dx, dy); }else if (type == ZOOM) {//如果是缩放的事件 float dist = distance(event); if (dist > 10f) { matrix.set(currentMatrix); float scale = dist / startDist; matrix.postScale(scale, scale, midPoint.x, midPoint.y); } } break; case MotionEvent.ACTION_POINTER_DOWN://第二个手指 startDist = distance(event);//两个手指之间的距离 if (startDist > 10f) { currentMatrix.set(matrix); type = ZOOM; midPoint = midPoint(event); } break; case MotionEvent.ACTION_UP: break; case MotionEvent.ACTION_POINTER_UP: type = 0;//弹起来初始化 break; default: break; } meImageView.setImageMatrix(matrix); return true; } private 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); } private PointF midPoint(MotionEvent event){ float x = (event.getX(1) + event.getX(0)) / 2; float y = (event.getY(1) + event.getY(0)) / 2; return new PointF(x,y); } } }
//......