Android多点触摸放大缩小图片
1.Activity
package com.fit.touchimage;
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.view.View.OnTouchListener;
import android.view.ViewGroup.MarginLayoutParams;
import android.widget.ImageView;
public class MainActivity extends Activity implements OnTouchListener {
/** Called when the activity is first created. */
//放大缩小
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
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myImageView=(ImageView) findViewById(R.id.myImage);
myImageView.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);
}
}
2.布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:gravity="center">
<ImageView android:layout_width="fill_parent"
android:layout_height="fill_parent" android:scaleType="matrix"
android:id="@+id/myImage" android:src="@drawable/xiaoxiong"/>
</LinearLayout>