關于Android Matrix放大縮小圖片的onTouch監聽

jopen 10年前發布 | 25K 次閱讀 Android Android開發 移動開發

matrix 放大縮小 onTouch

private final class TouchListener implements View.OnTouchListener {

    /** 記錄是拖拉照片模式還是放大縮小照片模式 */
    private int mode = 0;// 初始狀態
    /** 拖拉照片模式 */
    private static final int MODE_DRAG = 1;
    /** 放大縮小照片模式 */
    private static final int MODE_ZOOM = 2;
    /** 用于記錄拖拉圖片移動的坐標位置 */
    private Matrix matrix = new Matrix();
    /** 用于記錄圖片要進行拖拉時候的坐標位置 */
    private Matrix currentMatrix = new Matrix();
    private Matrix defaultMatrix = new Matrix();
    /** 用于記錄開始時候的坐標位置 */
    private PointF startPoint = new PointF();

    /** 兩個手指的開始距離 */
    private float startDis;
    /** 兩個手指的中間點 */
    private PointF midPoint;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        /** 通過與運算保留最后八位 MotionEvent.ACTION_MASK = 255 */
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            // 手指壓下屏幕
            case MotionEvent.ACTION_DOWN:
                mode = MODE_DRAG;
                // 記錄ImageView當前的移動位置
                currentMatrix.set(imageView.getImageMatrix());
                startPoint.set(event.getX(), event.getY());
                break;
            // 手指在屏幕上移動,改事件會被不斷觸發
            case MotionEvent.ACTION_MOVE:
                // 拖拉圖片
                if (mode == MODE_DRAG) {
                    float dx = event.getX() - startPoint.x;
                    // 得到x軸的移動距離
                    float dy = event.getY() - startPoint.y; 
                    // 得到x軸的移動距離
                    // 在沒有移動之前的位置上進行移動
                    matrix.set(currentMatrix);
                    // 得到縮放倍數
                    matrix.postTranslate(dx, dy);
                }

// 放大縮小圖片 else if (mode == MODE_ZOOM) { float endDis = distance(event); // 結束距離 if (endDis > 10f) { // 兩個手指并攏在一起的時候素大于10 float scale = endDis / startDis; // 得到縮放倍數 matrix.set(currentMatrix); matrix.postScale(scale, scale,midPoint.x,midPoint.y); } } break; // 手指離開屏幕 case MotionEvent.ACTION_UP: // 當觸點離開屏幕,但是屏幕上還有觸點(手指) matrix.set(defaultMatrix); case MotionEvent.ACTION_POINTER_UP: mode = 0; break; // 當屏幕上已經有觸點(手指),再有一個觸點壓下屏幕 case MotionEvent.ACTION_POINTER_DOWN: mode = MODE_ZOOM; / 計算兩個手指間的距離 */ startDis = distance(event); / 計算兩個手指間的中間點 */ if (startDis > 10f) { // 兩個手指并攏在一起的時候像素大于10 midPoint = mid(event); //記錄當前ImageView的縮放倍數 currentMatrix.set(imageView.getImageMatrix()); } break; } imageView.setImageMatrix(matrix); return true; }

    /** 計算兩個手指間的距離 */
    private float distance(MotionEvent event) {
        float dx = event.getX(1) - event.getX(0);
        float dy = event.getY(1) - event.getY(0);
        /** 使用勾股定理返回兩點之間的距離 */
        return FloatMath.sqrt(dx * dx + dy * dy);
    }

    /** 計算兩個手指間的中間點 */
    private PointF mid(MotionEvent event) {
        float midX = (event.getX(1) + event.getX(0)) / 2;
        float midY = (event.getY(1) + event.getY(0)) / 2;
        return new PointF(midX, midY);
    }

}</pre></span>
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!