Android - 拖动并调整大小,当捏触摸界限时出错

时间:2013-04-14 21:52:36

标签: android view touch zoom drag

我正在尝试实现拖动和调整视图对象的大小。我有捏缩放手势的问题,因为有时当手指移得太快而离开连接触摸监听器的View对象时(同样的View Object我试图拖动和缩放),应用程序会崩溃。

因此,我将触摸侦听器附加到填充屏幕的视图,然后根据触摸事件的位置限制触摸操作。例如。如果触摸甚至在目标对象的边界内,那么它可以被拖动,如果我在其边界之外触摸,则它不能被拖动。

以下是连接到整个屏幕的触控侦听器的代码。

scaleView.setOnTouchListener(new View.OnTouchListener(){
        public boolean onTouch(View v, MotionEvent event){
            float viewWidth = mTouchBox.getWidth();
            float viewHeight = mTouchBox.getHeight();
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                mode = DRAG;
                //get initial box coords:
                x_0 = mTouchBox.getX();
                y_0 = mTouchBox.getY();
                //get initial touch raw coordinates:
                initialTouchRawX = event.getRawX();
                initialTouchRawY = event.getRawY();
                //get current scaling of box
                currentScale = mTouchBox.getScaleX();
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                oldDist2 = spacing(event);
                if (oldDist2 > 10f) {
                    mode = ZOOM;
                }
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_POINTER_UP:
                mode = NONE;
                break;
            case MotionEvent.ACTION_MOVE:
                float xmin = x_0 - viewWidth/2*(currentScale-1);
                float xmax = x_0 + viewWidth + viewWidth/2*(currentScale-1);
                float ymin = y_0 - viewHeight/2*(currentScale-1) + viewShift;
                float ymax = y_0 + viewHeight + viewHeight/2*(currentScale-1) + viewShift;
                //for dragging, check if touch is inside box bounds
                if (mode == DRAG 
                    && initialTouchRawX >= xmin && initialTouchRawX <= xmax 
                    && initialTouchRawY >= ymin && initialTouchRawY <= ymax ) { 
                    //we must shift the touch coordinates some:
                    float mShiftX = -(initialTouchRawX - x_0);
                    float mShiftY = -(initialTouchRawY - y_0);
                    mTouchBox.setX((float) event.getRawX()+mShiftX);
                    mTouchBox.setY((float) event.getRawY()+mShiftY);
                    mTouchBox2.setX((float) event.getRawX()+mShiftX);
                    mTouchBox2.setY((float) event.getRawY()+mShiftY); 
                } else if (mode == ZOOM) {
                    float newDist2 = spacing(event);
                    if (newDist2 > 10f) {
                        float newScale = newDist2 / oldDist2 * currentScale;
                        mTouchBox.setScaleX(newScale);
                        mTouchBox.setScaleY(newScale);                          
                    }
                }
                break;
            }
            return true; 
        }
    });

这很好用,但我想知道是否有更简单,更有效的方法来做这件事。如果我要附加这个代码(稍加修改),那么我正在尝试拖动和调整大小的View对象,如果捏缩放手势看起来移动得太快,我就会出现越界错误。

理想情况下,我只想在捏住需要缩放的对象时实现pinchzoom / scale,但不一定完全在其边界内,并且如果其中一个手指超出界限,则不会导致应用程序崩溃。有关如何做到这一点的任何建议吗?

0 个答案:

没有答案