@Override public boolean canScrollHorizontally(int direction) { /** * disables scrolling horizontally when paging disabled, fixes scrolling * for nested {@link android.support.v4.view.ViewPager} */ return pagingEnabled && super.canScrollHorizontally(direction); } }
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch(keyCode) { case KeyEvent.KEYCODE_SPACE: case KeyEvent.KEYCODE_DPAD_RIGHT: case KeyEvent.KEYCODE_DPAD_DOWN: case KeyEvent.KEYCODE_PAGE_DOWN: case KeyEvent.KEYCODE_MEDIA_NEXT: if (pager.canScrollHorizontally(1)) { pager.setCurrentItem(pager.getCurrentItem()+1, true); } return(true); case KeyEvent.KEYCODE_DPAD_LEFT: case KeyEvent.KEYCODE_DPAD_UP: case KeyEvent.KEYCODE_PAGE_UP: case KeyEvent.KEYCODE_MEDIA_PREVIOUS: if (pager.canScrollHorizontally(-1)) { pager.setCurrentItem(pager.getCurrentItem()-1, true); } return(true); } return(super.onKeyDown(keyCode, event)); }
@Override public boolean canScrollHorizontally(int direction) { return !isSwipeLocked && super.canScrollHorizontally(direction); }
@Override public boolean performAccessibilityAction(View host, int action, Bundle args) { if (super.performAccessibilityAction(host, action, args)) { return true; } switch (action) { case AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD: { if (canScrollHorizontally(1)) { setCurrentItem(mCurItem + 1); return true; } } return false; case AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD: { if (canScrollHorizontally(-1)) { setCurrentItem(mCurItem - 1); return true; } } return false; } return false; }
@Override public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) { super.onInitializeAccessibilityNodeInfo(host, info); info.setClassName(ViewPager.class.getName()); info.setScrollable(canScroll()); if (canScrollHorizontally(1)) { info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD); } if (canScrollHorizontally(-1)) { info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD); } }
/** * @param direction Negative to check scrolling left, positive to check scrolling right. * @return Whether it is possible for the child view of this layout to * scroll left or right. Override this if the child view is a custom view. */ private boolean canViewScrollHorizontally(View view, MotionEvent event, int direction) { boolean ret; event.offsetLocation(view.getScrollX() - view.getLeft(), view.getScrollY() - view.getTop()); if (mScrollLeftOrRightHandler != null) { boolean canViewScrollLeftOrRight = mScrollLeftOrRightHandler.canScrollLeftOrRight(view, direction); if (canViewScrollLeftOrRight) return true; } if (android.os.Build.VERSION.SDK_INT < 14) { if (view instanceof ViewPager) { ret = ((ViewPager) view).canScrollHorizontally(direction); } else { ret = view.getScrollX() * direction > 0; } } else { ret = ViewCompat.canScrollHorizontally(view, direction); } ret = ret || canChildrenScrollHorizontally(view, event, direction); if (DEBUG) Log.d(TAG, "canViewScrollHorizontally " + view.getClass().getName() + " " + ret); return ret; }