使用多点触控 实现图片的缩放和移动

来源:互联网 发布:腾达路由器mac怎么改 编辑:程序博客网 时间:2024/04/30 08:04

实现的效果如图:

这里写图片描述

代码如下

public class XImageView extends ImageView {    public XImageView(Context context) {        super(context);        init();    }    public XImageView(Context context, @Nullable AttributeSet attrs) {        super(context, attrs);        init();    }    //拖动    private static final int MODE_DRAG = 1;    //缩放    private static final int MODE_ZOOM = 2;    private int mode;    //图像状态矩阵    private Matrix matrix;    //记录拖动的一个点    private Point lastPoint;    //缩放的上一个参考点距离    private float lastDis;    //缩放中心点    private Point center;    private void init() {        lastPoint = new Point();        center = new Point();    }    @Override    public boolean onTouchEvent(MotionEvent event) {        int action = event.getAction();        switch (action & MotionEvent.ACTION_MASK) {            case MotionEvent.ACTION_DOWN:                //单个触控点按下                //记录当前的状态                matrix = getImageMatrix();                lastPoint.set((int) event.getX(), (int) event.getY());                mode = MODE_DRAG;                break;            case MotionEvent.ACTION_POINTER_DOWN:                //得到触控点的个数(触控点的下标从0开始)                //int count = event.getPointerCount();                //记录缩放中心点                lastDis = getDistance(event);                if (lastDis > 10) {                    mode = MODE_ZOOM;                    getCenter(event);                }                break;            case MotionEvent.ACTION_MOVE:                //触控在屏幕上的过程                switch (mode) {                    case MODE_DRAG:                        //得到当前的点                        int x = (int) event.getX();                        int y = (int) event.getY();                        //计算偏移                        matrix.postTranslate(x - lastPoint.x, y - lastPoint.y);                        //记录当前点为下一个移动的参考点                        lastPoint.set(x, y);                        break;                    case MODE_ZOOM:                        //处理缩放                        float newDis = getDistance(event);                        if (Math.abs(newDis - lastDis) <= 10) {                            //旋转                        } else if (newDis > 20) {                            // 计算缩放比例                            float sc = newDis / lastDis;                            matrix.postScale(sc, sc, center.x, center.y);                            lastDis = newDis;                        }                        break;                }                //改变状态                //setImageMatrix(matrix);                //刷新                invalidate();                break;            case MotionEvent.ACTION_POINTER_UP:                break;            case MotionEvent.ACTION_UP:                //单个触控点离开                break;        }        return true;    }    /**     * 获取两个触控点之间的距离     *     * @param event     * @return     */    private float getDistance(MotionEvent event) {        return (float) Math.sqrt(Math.pow(event.getX(0) - event.getX(1), 2) + Math.pow(event.getY(0) - event.getY(1), 2));    }    /**     * 获取缩放中心点     *     * @param event     */    private void getCenter(MotionEvent event) {        int x = (int) ((event.getX(0) + event.getX(1)) / 2);        int y = (int) ((event.getY(0) + event.getY(1)) / 2);        center.set(x, y);    }}
阅读全文
0 0
原创粉丝点击