我正在尝试实现视图对象的拖动和调整大小。我在使用捏缩放手势时遇到问题,有时当手指分开太快并离开附有触摸侦听器的视图对象(我试图拖动和缩放相同的视图对象)时,应用程序会崩溃.
因此,我将触摸侦听器附加到填充屏幕的 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;
}
});
这很好用,但我想知道是否有更简单、更有效的方法来做这件事。如果我要将这段代码(经过一些修改)附加到我试图拖动和调整大小的视图对象中,那么如果捏缩放手势看起来移动得太快,我就会出现越界错误。
理想情况下,我只想在需要缩放的对象上进行捏合缩放/缩放,但不一定完全在其范围内,并且如果其中一个手指超出范围,应用程序不会崩溃。关于如何做到这一点的任何建议?