1

我正在尝试实现视图对象的拖动和调整大小。我在使用捏缩放手势时遇到问题,有时当手指分开太快并离开附有触摸侦听器的视图对象(我试图拖动和缩放相同的视图对象)时,应用程序会崩溃.

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

下面是附加到整个屏幕的触摸监听器的代码。

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; 
        }
    });

这很好用,但我想知道是否有更简单、更有效的方法来做这件事。如果我要将这段代码(经过一些修改)附加到我试图拖动和调整大小的视图对象中,那么如果捏缩放手势看起来移动得太快,我就会出现越界错误。

理想情况下,我只想在需要缩放的对象上进行捏合缩放/缩放,但不一定完全在其范围内,并且如果其中一个手指超出范围,应用程序不会崩溃。关于如何做到这一点的任何建议?

4

0 回答 0