android 圖片的 放大 縮小 移動

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

    public class MainActivity extends Activity {

    private ImageView imageView;  

    @Override  
    public void onCreate(Bundle savedInstanceState) {  
          super.onCreate(savedInstanceState);  

            setContentView(R.layout.activity_main);  
            imageView = (ImageView) findViewById(R.id.imageView);  
            imageView.setOnTouchListener(new OnTouchListener() {  
            // 設置開始點  
            private PointF startPoint = new PointF();  
            // 設置圖片位置的變換矩陣  
            private Matrix matrix = new Matrix();  
            // 設置圖片當前位置的變換矩陣  
            private Matrix currentMatrix = new Matrix();  
            // 初始化模式參數  
            private int mode = 0;  
            // 無模式  
            private static final int NONE = 0;  
            // 拖拉模式  
            private static final int DRAG = 1;  
            // 縮放模式  
            private static final int ZOOM = 2;  
            // 開啟縮放效果的門檻  
            private static final float ZOOM_THRESHOLD = 10.0f;  
            // 開始距離  
            private float startDistance;  
            // 中心點  
            private PointF middlePoint;  

            @Override  
            public boolean onTouch(View v, MotionEvent event) {  

                switch (event.getAction() & MotionEvent.ACTION_MASK) {  
                case MotionEvent.ACTION_DOWN:  
                    mode = DRAG;  
                    // 記錄圖片當前的移動位置  
                    currentMatrix.set(imageView.getImageMatrix());  
                    // 記錄開始坐標  
                    startPoint.set(event.getX(), event.getY());  
                    break;  

                 // 當屏幕上已經有觸點(手指),再有手指按下時觸發該事件  
                case MotionEvent.ACTION_POINTER_DOWN:  
                    mode = ZOOM;  
                    //得到兩點間的距離  
                    startDistance = getDistance(event);  
                    //如果大于  
                    if(startDistance > ZOOM_THRESHOLD) {  
                        //得到兩點的中間點  
                        middlePoint = getMiddlePoint(event);  
                        // 記錄圖片當前的縮放比例  
                        currentMatrix.set(imageView.getImageMatrix());  
                    }  
                    break;  


                case MotionEvent.ACTION_MOVE:  
                    if(mode == DRAG) {  
                        // 獲取X軸移動距離  
                        float distanceX = event.getX() - startPoint.x;  
                        // 獲取Y軸移動距離  
                        float distanceY = event.getY() - startPoint.y;  
                        // 在上次移動停止位置的基礎上再進行移動  
                        matrix.set(currentMatrix);  
                        // 實現圖片位置移動  
                        matrix.postTranslate(distanceX, distanceY);  
                     }else if(mode == ZOOM) {  
                        // 結束距離  
                        float endDistance = getDistance(event);  
                        if(endDistance > ZOOM_THRESHOLD) {  
                            // 縮放比例  
                            float scale = endDistance / startDistance;  
                            matrix.set(currentMatrix);  
                            matrix.postScale(scale, scale, middlePoint.x, middlePoint.y);  
                        }  
                    }  
                    break;  

                case MotionEvent.ACTION_UP:  
                // 當手指離開屏幕,但屏幕上仍有其他觸點(手指)時觸發該事件  
                case MotionEvent.ACTION_POINTER_UP:  
                    mode = 0;  
                    break;   
                }  
                imageView.setImageMatrix(matrix);  
                return true;  
            }  

        });  
    }  


        /** 
         * 計算兩點之間的距離 
         */  
        public static float getDistance(MotionEvent event) {  
            //第二個點x、y坐標減去第一個點x、y坐標  
            float disX = event.getX(1) - event.getX(0);  
            float disY = event.getY(1) - event.getY(0);  
            return FloatMath.sqrt(disX * disX + disY * disY);  
        }  

        /** 
         * 計算兩點之間的中間點 
         */  
        public static PointF getMiddlePoint(MotionEvent event) {  
            float midX = (event.getX(0) + event.getX(1)) /2;  
            float midY = (event.getY(0) + event.getY(1)) /2;  
            return new PointF(midX, midY);  
        }  

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