Я работаю над картой внутреннего пространства, я создаю пользовательский класс для вида поверхности. Все отлично, но проблема в том, что когда я переводю карту, изображение прокручивается бесконечно, я использую масштабирование и пинч , условие, карта не должна выходить за пределы экрана, пожалуйста, помогите мне. Код события My On touch прилагается здесь.
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!isMapLoaded) {
return false;
}
float newDist;
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
touchState = 0;
saveMatrix.set(currentMatrix);
startTouch.set(event.getX(), event.getY());
currentTouchState = MapView.TOUCH_STATE_SCROLL;
break;
case MotionEvent.ACTION_POINTER_DOWN:
if (event.getPointerCount() == 2) {
saveMatrix.set(currentMatrix);
saveZoom = currentZoom;
startTouch.set(event.getX(0), event.getY(0));
currentTouchState = MapView.TOUCH_STATE_TWO_POINTED;
mid = midPoint(event);
oldDist = distance(event.getX(), event.getY(), mid);
}
break;
case MotionEvent.ACTION_UP:
if (withFloorPlan(event.getX(), event.getY())) {
// layers on touch
float deltaX = startTouch.x - event.getX();
float deltaY = startTouch.y - event.getY();
if (deltaX < 0)
deltaX *= -1;
if (deltaY < 0)
deltaY *= -1;
if (touchState == 0 || (deltaX < 50 && deltaY < 50)) {
isListenerCalled = true;
// Some work here
}
}
currentTouchState = MapView.TOUCH_STATE_NO;
break;
case MotionEvent.ACTION_POINTER_UP:
currentTouchState = MapView.TOUCH_STATE_NO;
break;
case MotionEvent.ACTION_MOVE:
touchState = 2;
switch (currentTouchState) {
case MapView.TOUCH_STATE_SCROLL: {
currentMatrix.set(saveMatrix);
currentMatrix.postTranslate(event.getX() - startTouch.x, event.getY() - startTouch.y);
// rebound();
refresh();
}
break;
case MapView.TOUCH_STATE_TWO_POINTED: {
Log.d("states", "pointed " + event.getX() + " " + event.getY());
statePointed(event.getX(), event.getY());
}
break;
case MapView.TOUCH_STATE_SCALE: {
Log.d("states", "scale");
currentMatrix.set(saveMatrix);
newDist = distance(event.getX(), event.getY(), mid);
float scale = newDist / oldDist;
if (scale * saveZoom < minZoom) {
scale = minZoom / saveZoom;
} else if (scale * saveZoom > maxZoom) {
scale = maxZoom / saveZoom;
}
currentZoom = scale * saveZoom;
currentMatrix.postScale(scale, scale, mid.x, mid.y);
}
break;
default:
break;
}
break;
default:
break;
}
return true;
}