多点触控-------图片放大缩小与拖拽

来源:互联网 发布:公安部软件检测中心 编辑:程序博客网 时间:2024/05/21 06:51

布局<ImageView    android:id="@+id/image"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:src="@mipmap/ic_launcher"    android:scaleType="matrix"/>
接下来就是代码了,不多说,直接上代码

public class MainActivity extends AppCompatActivity implements View.OnTouchListener{    private ImageView image;    private Matrix matrix = new Matrix();    private Matrix savedMatrix = new Matrix();    private static final int NONE = 0;    private static final int DRAG = 1;    private static final int ZOOM = 2;    private int mode = NONE;    // 第一个按下的手指的点    private PointF startPoint = new PointF();    // 两个按下的手指的触摸点的中点    private PointF midPoint = new PointF();    // 初始的两个手指按下的触摸点的距离    private float oriDis = 1f;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        image = (ImageView) findViewById(R.id.image);        image.setOnTouchListener(this);    }    @Override    public boolean onTouch(View v, MotionEvent event) {        ImageView view= (ImageView) v;        switch (event.getAction()&MotionEvent.ACTION_MASK){            case MotionEvent.ACTION_DOWN:                // 第一个手指按下事件                matrix.set(view.getImageMatrix());                savedMatrix.set(matrix);                startPoint.set(event.getX(), event.getY());                mode = DRAG;                break;            case MotionEvent.ACTION_POINTER_DOWN:                // 第二个手指按下事件                oriDis = distance(event);                if (oriDis > 10f) {                    savedMatrix.set(matrix);                    midPoint = middle(event);                    mode = ZOOM;                }                break;            case MotionEvent.ACTION_UP:            case MotionEvent.ACTION_POINTER_UP:                // 手指放开事件                mode = NONE;                break;            case MotionEvent.ACTION_MOVE:                // 手指滑动事件                if (mode == DRAG) {                    // 是一个手指拖动                    matrix.set(savedMatrix);                    matrix.postTranslate(event.getX() - startPoint.x, event.getY()                            - startPoint.y);                } else if (mode == ZOOM) {                    // 两个手指滑动                    float newDist = distance(event);                    if (newDist > 10f) {                        matrix.set(savedMatrix);                        float scale = newDist / oriDis;                        matrix.postScale(scale, scale, midPoint.x, midPoint.y);                    }                }                break;        }        // 设置ImageView的Matrix        view.setImageMatrix(matrix);        return true;    }    // 计算两个触摸点之间的距离    private float distance(MotionEvent event) {        float x = event.getX(0) - event.getX(1);        float y = event.getY(0) - event.getY(1);        return (float) Math.sqrt(x * x + y * y);    }    // 计算两个触摸点的中点    private PointF middle(MotionEvent event) {        float x = event.getX(0) + event.getX(1);        float y = event.getY(0) + event.getY(1);        return new PointF(x / 2, y / 2);    }}


阅读全文
1 0
原创粉丝点击