在Android上的双指缩放比例限制 [英] Scale limits on pinch zoom of android

查看:165
本文介绍了在Android上的双指缩放比例限制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何设置最大和最小缩放级别捏缩放?


下面是我的code: //

 公共类TouchImageView扩展ImageView的{

     私有静态最后字符串变量=触摸;

        //这些矩阵将用于移动和放大图像
        字模=新的Matrix();
        矩阵savedMatrix =新的Matrix();
        静态PinchZoomExample sPinchZoomExample = NULL;
        //我们可以在这3个状态之一
        静态最终诠释无= 0;
        静态最终诠释DRAG = 1;
        静态最终诠释ZOOM = 2;
        INT模式=无;
        静态位图sCurrentImage;

        //记住一些东西放大
        的PointF开始=新的PointF();
        的PointF中期=新的PointF();
        浮oldDist = 1F;

        上下文语境;


        公共TouchImageView(上下文的背景下){
            超(上下文);
            super.setClickable(真正的);
            this.context =背景;

            matrix.setTranslate(1F,1F);
            setImageMatrix(矩阵);
            setScaleType(ScaleType.MATRIX);

            setOnTouchListener(新OnTouchListener(){

                @覆盖
                公共布尔onTouch(视图V,MotionEvent rawEvent){
                    WrapMotionEvent事件= WrapMotionEvent.wrap(rawEvent);

                    //转储触摸事件日志
                   / *如果(Viewer.isDebug ==真){
                        dumpEvent(事件);
                    } * /

                    //这里处理触摸事件...
                    开关(event.getAction()及MotionEvent.ACTION_MASK){
                    案例MotionEvent.ACTION_DOWN:
                        savedMatrix.set(矩阵);
                        start.set(event.getX(),event.getY());
                        Log.d(TAG模式= DRAG);
                        模式=阻力;
                        打破;
                    案例MotionEvent.ACTION_POINTER_DOWN:
                        oldDist =间距(事件);
                        Log.d(TAG,oldDist =+ oldDist);
                        如果(oldDist> 10F){
                            savedMatrix.set(矩阵);
                            中点(中,事件);
                            模式=变焦;
                            Log.d(TAG模式= ZOOM);
                        }
                        打破;
                    案例MotionEvent.ACTION_UP:
                        INT xDiff =(INT)Math.abs(event.getX() -  start.x);
                        INT yDiff =(INT)Math.abs(event.getY() -  start.y);
                        如果(xDiff&所述8安培;&安培; yDiff&所述; 8){
                            performClick();
                            sPinchZoomExample.displayGallery();
                        }
                    案例MotionEvent.ACTION_POINTER_UP:
                        模式=无;
                        Log.d(TAG模式= NONE);
                        打破;
                    案例MotionEvent.ACTION_MOVE:
                        如果(模式==拖动){
                            // ...
                            matrix.set(savedMatrix);
                            matrix.postTranslate(event.getX() -  start.x,event.getY() -  start.y);
                        }否则,如果(模式==变焦){
                            浮newDist =间距(事件);
                            Log.d(TAG,newDist =+ newDist);
                            如果(newDist> 10F){
                                matrix.set(savedMatrix);
                                浮规模= newDist / oldDist;

                                matrix.postScale(规模化,规模化,mid.x,mid.y);

                                //帆布油画=新的Canvas();

//位图BM = Bitmap.createBitmap(sCurrentImage,0,0,sCurrentImage.getWidth()
//,sCurrentImage.getHeight(),矩阵,真正的);
                                Log.d(尺度,规模=+规模++的getWidth()++的getHeight());
                                //bm.recycle();
                            }
                        }
                        打破;
                    }

                    setImageMatrix(矩阵);
                    返回true; //表示事件已经被处理
                }

            });
        }


        公共无效setImage(位图BM,诠释displayWidth,INT displayHeight,PinchZoomExample PZE){
            super.setImageBitmap(BM);
            sCurrentImage = BM;
            sPinchZoomExample = PZE;
            //适应屏幕。
            浮规模;
            如果((displayHeight / bm.getHeight())> =(displayWidth / bm.getWidth())){
                规模=(浮点)displayWidth /(浮点)bm.getWidth();
            } 其他 {
                规模=(浮点)displayHeight /(浮点)bm.getHeight();
            }

            savedMatrix.set(矩阵);
            matrix.set(savedMatrix);
            matrix.postScale(规模化,规模化,mid.x,mid.y);
            setImageMatrix(矩阵);


            //中心图像
            浮动redundantYSpace =(浮点)displayHeight  - (规模*(浮点)bm.getHeight());
            浮动redundantXSpace =(浮点)displayWidth  - (规模*(浮点)bm.getWidth());

            redundantYSpace / =(浮点)2;
            redundantXSpace / =(浮点)2;


            savedMatrix.set(矩阵);
            matrix.set(savedMatrix);
            matrix.postTranslate(redundantXSpace,redundantYSpace); //matrix.postTranslate(50,50);
            setImageMatrix(矩阵);


        }




        / **确定第一两个手指之间的空间* /
        私人浮动间距(WrapMotionEvent事件){
            // ...
            浮X = event.getX(0) -  event.getX(1);
            浮Y = event.getY(0) -  event.getY(1);
            返回FloatMath.sqrt(X * X + Y * Y);
        }

        / **计算前两个手指的中点* /
        私人无效中点(的PointF点,WrapMotionEvent事件){
            // ...
            浮X = event.getX(0)+ event.getX(1);
            浮Y = event.getY(0)+ event.getY(1);
            point.set(X / 2,Y / 2);
        }

}
 

解决方案

 私有静态最终浮动MIN_ZOOM = 1.0F;
私有静态最终浮动MAX_ZOOM = 5.0F;

规模= Math.max(MIN_ZOOM,Math.min(规模,MAX_ZOOM));
 

How to set Max and Min zoom levels for Pinch-Zoom?


Here is my code: //

public class TouchImageView extends ImageView {

     private static final String TAG = "Touch";

        // These matrices will be used to move and zoom image
        Matrix matrix = new Matrix();
        Matrix savedMatrix = new Matrix();
        static PinchZoomExample sPinchZoomExample = null;
        // We can be in one of these 3 states
        static final int NONE = 0;
        static final int DRAG = 1;
        static final int ZOOM = 2;
        int mode = NONE;
        static Bitmap sCurrentImage;

        // Remember some things for zooming
        PointF start = new PointF();
        PointF mid = new PointF();
        float oldDist = 1f;

        Context context;


        public TouchImageView(Context context) {
            super(context);
            super.setClickable(true);
            this.context = context;

            matrix.setTranslate(1f, 1f);
            setImageMatrix(matrix);
            setScaleType(ScaleType.MATRIX);

            setOnTouchListener(new OnTouchListener() {

                @Override
                public boolean onTouch(View v, MotionEvent rawEvent) {
                    WrapMotionEvent event = WrapMotionEvent.wrap(rawEvent);

                    // Dump touch event to log
                   /* if (Viewer.isDebug == true){
                        dumpEvent(event);
                    }*/

                    // Handle touch events here...
                    switch (event.getAction() & MotionEvent.ACTION_MASK) {
                    case MotionEvent.ACTION_DOWN:
                        savedMatrix.set(matrix);
                        start.set(event.getX(), event.getY());
                        Log.d(TAG, "mode=DRAG");
                        mode = DRAG;
                        break;
                    case MotionEvent.ACTION_POINTER_DOWN:
                        oldDist = spacing(event);
                        Log.d(TAG, "oldDist=" + oldDist);
                        if (oldDist > 10f) {
                            savedMatrix.set(matrix);
                            midPoint(mid, event);
                            mode = ZOOM;
                            Log.d(TAG, "mode=ZOOM");
                        }
                        break;
                    case MotionEvent.ACTION_UP:
                        int xDiff = (int) Math.abs(event.getX() - start.x);
                        int yDiff = (int) Math.abs(event.getY() - start.y);
                        if (xDiff < 8 && yDiff < 8){
                            performClick();
                            sPinchZoomExample.displayGallery();
                        }
                    case MotionEvent.ACTION_POINTER_UP:
                        mode = NONE;
                        Log.d(TAG, "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);
                            Log.d(TAG, "newDist=" + newDist);
                            if (newDist > 10f) {
                                matrix.set(savedMatrix);
                                float scale = newDist / oldDist;

                                matrix.postScale(scale, scale, mid.x, mid.y);

                                //Canvas canvas = new Canvas();

//                              Bitmap bm = Bitmap.createBitmap(sCurrentImage,0, 0, sCurrentImage.getWidth()
//                                      , sCurrentImage.getHeight(), matrix, true);
                                Log.d("SCALE", "scale=" + scale + "  " + getWidth() + "  " + getHeight());
                                //bm.recycle();
                            }
                        }
                        break;
                    }

                    setImageMatrix(matrix);
                    return true; // indicate event was handled
                }

            });
        }


        public void setImage(Bitmap bm, int displayWidth, int displayHeight , PinchZoomExample pze) { 
            super.setImageBitmap(bm);
            sCurrentImage = bm;
            sPinchZoomExample = pze;
            //Fit to screen.
            float scale;
            if ((displayHeight / bm.getHeight()) >= (displayWidth / bm.getWidth())){
                scale =  (float)displayWidth / (float)bm.getWidth();
            } else {
                scale = (float)displayHeight / (float)bm.getHeight();
            }

            savedMatrix.set(matrix);
            matrix.set(savedMatrix);
            matrix.postScale(scale, scale, mid.x, mid.y);
            setImageMatrix(matrix);


            // Center the image
            float redundantYSpace = (float)displayHeight - (scale * (float)bm.getHeight()) ;
            float redundantXSpace = (float)displayWidth - (scale * (float)bm.getWidth());

            redundantYSpace /= (float)2;
            redundantXSpace /= (float)2;


            savedMatrix.set(matrix);
            matrix.set(savedMatrix);
            matrix.postTranslate(redundantXSpace, redundantYSpace);   //matrix.postTranslate(50, 50);
            setImageMatrix(matrix);


        }




        /** Determine the space between the first two fingers */
        private float spacing(WrapMotionEvent event) {
            // ...
            float x = event.getX(0) - event.getX(1);
            float y = event.getY(0) - event.getY(1);
            return FloatMath.sqrt(x * x + y * y);
        }

        /** Calculate the mid point of the first two fingers */
        private void midPoint(PointF point, WrapMotionEvent event) {
            // ...
            float x = event.getX(0) + event.getX(1);
            float y = event.getY(0) + event.getY(1);
            point.set(x / 2, y / 2);
        }

}

解决方案

private static final float MIN_ZOOM = 1.0f;
private static final float MAX_ZOOM = 5.0f;

scale = Math.max(MIN_ZOOM, Math.min(scale, MAX_ZOOM));

这篇关于在Android上的双指缩放比例限制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆