zasada postępowania w takiej sytuacji jest taka, żeby nie stosować IF- ów ale stworzyć schematu który policzy się sam i nie zablokuje możliwości przesunięcia poza krawędź ale skoryguje jak takie przysunięcie nastąpi
public class ScrolView extends ViewGroup implements GestureDetector.OnGestureListener {
private final GestureDetector mGestureDetector;
private final Rect mWorldRect = new Rect(500, 500, -500, -500);
private final Rect mScreenRect = new Rect(0, 0, 0, 0);
public ScrolView(Context context, AttributeSet attrs) {
super(context, attrs);
mGestureDetector = new GestureDetector(context, this);
}
@Override
public boolean dispatchTouchEvent(final MotionEvent event) {
if (mGestureDetector.onTouchEvent(event)) {
return true;
}
return super.dispatchTouchEvent(event);
}
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
mScreenRect.set(getScrollX(), getScrollY(), getScrollX() + getWidth(), getScrollY() + getHeight());
if (mScreenRect.contains(mWorldRect)) {
scrollBy((int) distanceX, (int) distanceY);
} else {
scrollTo(Math.max(Math.min(mScreenRect.left, mWorldRect.left), mWorldRect.right - mScreenRect.width()), Math.max(Math.min(mScreenRect.top, mWorldRect.top), mWorldRect.bottom - mScreenRect.height()));
}
return true;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
}