图片拖动和缩放功能

在图片拖动的基础上增加

package com.xiawenquan;

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.widget.ImageView;

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
	private ImageView imageView;
	private PointF startPoint = null;
	private Matrix matrix = null;
	private Matrix currMatrix ;
	private int drug = 5;
	private int zoom = 10;
	private int type = 0;
	private float startDistance;
	private PointF midPointF;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        startPoint = new PointF();
        matrix = new Matrix(); // 用于拖拉变换
        currMatrix = new Matrix(); // 用于拖拉变换
        
        
        imageView = (ImageView) findViewById(R.id.imageView);
        imageView.setOnTouchListener(new View.OnTouchListener() {
			
			@Override
			public boolean onTouch(View view, MotionEvent event) {
				switch (event.getAction() & MotionEvent.ACTION_MASK) {
				case MotionEvent.ACTION_DOWN://只有一个手指按下屏幕时触发的事件
					currMatrix.set(matrix); // 保存上一次的移动点
					startPoint.set(event.getX(),event.getY());//移动前,手指按下的位置
					
					type = drug; // 只有一个手指按下屏幕时属于拖拉
					
					break;
				case MotionEvent.ACTION_MOVE://手指在屏幕移动时触发的事件,该事件在移动过程不断被触发
					if(type == drug){
						float mX = event.getX() - startPoint.x; // 移动点的X坐标
						float mY = event.getY() - startPoint.y;// 移动点的Y坐标
						matrix.set(currMatrix); // 保存当前变换的点
						matrix.postTranslate(mX, mY); // 移动到指定的点
					}else if(type == zoom){
						float distance = distance(event);
						if(distance > 5f){
							matrix.set(currMatrix); //在上次缩放结果的基本上进行缩放
							float cale =  distance / startDistance; // 获取距离的倍数
							matrix.preScale(cale, cale, midPointF.x, midPointF.y); // 前面2个参数是X,Y坐标缩放,后面的参考点的X,Y坐标
						}
						
					}
					
					break;
					
				case MotionEvent.ACTION_POINTER_DOWN://如果已经有一个手指按下屏幕,后续再有手指按下屏幕,就会触发这个事件
					startDistance = distance(event); // 保存2个手指的距离
					if(startDistance > 5f){ // 2个手指的最小距离是5个像素
						type = zoom;
						currMatrix.set(matrix); // 保存第一次缩放后的位置,用于2次以后的缩放(//保存当前的缩放结果)
						midPointF = getMidPoinF(event);
					}
					
					
					break;
					
				case MotionEvent.ACTION_UP://最后一个手指离开屏幕后触发的事件
					break;
				case MotionEvent.ACTION_POINTER_UP://有一个手指离开了屏幕,但还有手指在屏幕上,此时会触发该事件
					type = 0; // 当离开屏幕的时候还原。
					break;

				default:
					break;
				}
				
				imageView.setImageMatrix(matrix); // imageView在移动
				return true;
			}
		});
    }
    
    // 求两点的距离
    private float distance(MotionEvent event){
    	float eX = event.getX(1) - event.getX(0); // 后一个点减去前一个点
    	float eY = event.getY(1) - event.getY(0);
    	return  FloatMath.sqrt(eX * eX  + eY * eY);
    }
    
    // 求2点的中心点
    private PointF getMidPoinF(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);
    }
}

相关推荐