Android手勢縮放圖片以及圖片黏貼在手指隨手勢移動

mgwd 9年前發布 | 1K 次閱讀 Java Android

一個Android手勢縮放圖片的工具類;同時,此類還實現另外一個功能:當手指按在觸屏上移動時候,圖片“黏貼”在手指上隨手指移動而整體移動。

具體使用方法可以是這樣:先new一個此類的實例,然后在ImageView的方法setOnTouchListener(new ImageViewOnMultiTouchListener());

例如:

    ImageViewOnMultiTouchListener listener=new ImageViewOnMultiTouchListener();  
            ImageView mImageView=(ImageView)findViewById(R.id.imageView);  
            mImageView.setOnTouchListener(listener);  

ImageViewOnMultiTouchListener.java全部源代碼:

    public class ImageViewOnMultiTouchListener implements View.OnTouchListener {

        private final int NONE = 0;  
        private final int MOVE = 1;  
        private final int ZOOM = 2;  
        private final int DRAG = 3;  

        private int mode = NONE;  
        private Matrix matrix = new Matrix();  
        private Matrix savedMatrix = new Matrix();  
        private PointF start = new PointF();  
        private PointF mid = new PointF();  
        private float oldDistance = 0;  

        @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);  
                start.set(event.getX(), event.getY());  

                mode = DRAG;  

                break;  

            case MotionEvent.ACTION_POINTER_DOWN:  
                oldDistance = spacing(event);  
                if (oldDistance > 5f) {  
                    savedMatrix.set(matrix);  
                    midPoint(mid, 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() - start.x, event.getY()  
                            - start.y);  
                } else if (mode == ZOOM) {  
                    float newDist = spacing(event);  
                    if (newDist > 5f) {  
                        matrix.set(savedMatrix);  
                        float scale = newDist / oldDistance;  
                        matrix.postScale(scale, scale, mid.x, mid.y);  
                    }  
                }  

                break;  
            }  

            view.setImageMatrix(matrix);  
            view.setScaleType(ImageView.ScaleType.MATRIX);  
            view.setPadding(3, 5, 3, 5);  

            return true;  
        }  

        private float spacing(MotionEvent event) {  
            float x = event.getX(0) - event.getX(1);  
            float y = event.getY(0) - event.getY(1);  

            return FloatMath.sqrt(x * x + y * y);  
        }  

        private void midPoint(PointF point, MotionEvent event) {  
            float x = event.getX(0) + event.getX(1);  
            float y = event.getY(0) + event.getY(1);  

            point.set(x / 2, y / 2);  
        }  
    }  </pre> 


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