package com.example.administrator.zuo; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; 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.widget.ImageView; public class MainActivity extends Activity implements View.OnTouchListener { //放大缩小 Matrix matrix=new Matrix(); Matrix savedMatrix=new Matrix(); PointF start=new PointF(); PointF mid=new PointF(); float oldDist; private ImageView myImageView; //模式 static final int NONE=0; static final int DRAG=1; static final int ZOOM=2; int mode=NONE; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView img= (ImageView) findViewById(R.id.imageView); img.setOnTouchListener(this); } @Override public boolean onTouch(View v, MotionEvent event) { ImageView myImageView=(ImageView) v; //应用于多点触摸操作 switch(event.getAction()&MotionEvent.ACTION_MASK){ //设置拖拉模式 case MotionEvent.ACTION_DOWN: matrix.set(myImageView.getImageMatrix()); savedMatrix.set(matrix); start.set(event.getX(),event.getY()); mode=DRAG; break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: mode=NONE; break; //设置多点触摸模式 case MotionEvent.ACTION_POINTER_DOWN: oldDist=spacing(event); if(oldDist>10f){ savedMatrix.set(matrix); midPoint(mid, event); mode=ZOOM;//放大 } break; //若为DRAG模式,则点击移动图片 case MotionEvent.ACTION_MOVE: if(mode==DRAG){ matrix.set(savedMatrix); matrix.postTranslate(event.getX()-start.x,event.getY()-start.y); } //若为ZOOM模式,则点击触摸缩放 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; } myImageView.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); } }