| 385 | private int lastXoff; |
| 386 | |
| 387 | @Override |
| 388 | public boolean onTouchEvent(MotionEvent event) { |
| 389 | boolean intercept = false; |
| 390 | if (event.getAction() == MotionEvent.ACTION_DOWN) |
| 391 | intercept = true; // Prevent ACTION_CANCEL on fling |
| 392 | else if (event.getAction() == MotionEvent.ACTION_MOVE) { |
| 393 | int yrange = computeVerticalScrollRange(); |
| 394 | int yextend = computeVerticalScrollExtent(); |
| 395 | boolean canScrollVertical = (yrange > yextend); |
| 396 | if (canScrollVertical) { |
| 397 | int bottom = yrange - yextend; |
| 398 | int yoff = computeVerticalScrollOffset(); |
| 399 | float dy = lastY - event.getY(); |
| 400 | intercept = (yoff > 0 || dy >= 0) && (yoff < bottom || dy <= 0); |
| 401 | } |
| 402 | |
| 403 | if (!intercept) { |
| 404 | int xrange = computeHorizontalScrollRange(); |
| 405 | int xextend = computeHorizontalScrollExtent(); |
| 406 | boolean canScrollHorizontal = (xrange > xextend); |
| 407 | if (canScrollHorizontal) { |
| 408 | int right = xrange - xextend; |
| 409 | int xoff = computeHorizontalScrollOffset(); |
| 410 | int ldx = xoff - lastXoff; |
| 411 | float dx = lastX - event.getX(); |
| 412 | intercept = (xoff > 0 || dx >= 0) && |
| 413 | (xoff < right || dx <= 0) && |
| 414 | (Math.signum(dx) == Math.signum(ldx)); |
| 415 | lastXoff = xoff; |
| 416 | } |
| 417 | } |
| 418 | } |
| 419 | |
| 420 | // There will be scroll issues without this |
| 421 | if (viewportHeight == 0) |
| 422 | intercept = false; |
| 423 | |
| 424 | getParent().requestDisallowInterceptTouchEvent(intercept || event.getPointerCount() > 1); |
| 425 | |
| 426 | lastX = event.getX(); |
| 427 | lastY = event.getY(); |
| 428 | return super.onTouchEvent(event); |
| 429 | } |
| 430 | |
| 431 | @Override |
| 432 | public boolean dispatchKeyEvent(KeyEvent event) { |