我正在尝试实现拖动和调整视图对象的大小。我有捏缩放手势的问题,因为有时当手指移得太快而离开连接触摸监听器的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,但不一定完全在其边界内,并且如果其中一个手指超出界限,则不会导致应用程序崩溃。有关如何做到这一点的任何建议吗?