/** * Scroll to the child at the position passed. * * @param childPosition the child's position * @return if scrolling to the child is starting, false otherwise */ private boolean scrollToChild(final int childPosition) { final View child = getChildAt(childPosition); if (child != null) { final int distance = getGalleryLockPoint() - getLeftOfView(child); mFlingRunnable.startUsingDistance(distance); return true; } return false; }
@Override public void onFling(float startX, float startY, float velocityX, float velocityY) { DraweeView<GenericDraweeHierarchy> draweeView = getDraweeView(); if (draweeView == null) { return; } mCurrentFlingRunnable = new FlingRunnable(draweeView.getContext()); mCurrentFlingRunnable.fling(getViewWidth(), getViewHeight(), (int) velocityX, (int) velocityY); draweeView.post(mCurrentFlingRunnable); }
/** * Scrolls the items so that the selected item is in its 'slot' (its center is the Gallery's * center). * * <p>Note: modifed to snap the left of a view rather than the center */ private void scrollIntoSlots() { if (getChildCount() == 0 || mSelectedChild == null) { return; } final int selectedCenter = getLeftOfView(mSelectedChild); final int targetCenter = getGalleryLockPoint(); final int scrollAmount = targetCenter - selectedCenter; if (scrollAmount != 0) { mFlingRunnable.startUsingDistance(scrollAmount); } else { onFinishedMovement(); } }
@Override public final void onFling(float startX, float startY, float velocityX, float velocityY) { if (DEBUG) { Log.d( LOG_TAG, "onFling. sX: " + startX + " sY: " + startY + " Vx: " + velocityX + " Vy: " + velocityY); } ImageView imageView = getImageView(); if (hasDrawable(imageView)) { mCurrentFlingRunnable = new FlingRunnable(imageView.getContext()); mCurrentFlingRunnable.fling( imageView.getWidth(), imageView.getHeight(), (int) velocityX, (int) velocityY); imageView.post(mCurrentFlingRunnable); } }
@Override public final boolean onTouch(View v, MotionEvent ev) { boolean handled = false; if (isZoomEnabled) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: // First, disable the Parent from intercepting the touch // event if (v.getParent() != null) { v.getParent().requestDisallowInterceptTouchEvent(true); } // If we're flinging, and the user presses down, cancel // fling if (currentFlingRunnable != null) { currentFlingRunnable.cancelFling(); currentFlingRunnable = null; } break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: // If the user has zoomed less than min scale, zoom back // to min scale if (getScale() < minScale) { RectF rect = getDisplayRect(); if (null != rect) { v.post( new AnimatedZoomRunnable(getScale(), minScale, rect.centerX(), rect.centerY())); handled = true; } } break; } // Finally, try the scale/drag/tap detector if ((multiGestureDetector != null) && multiGestureDetector.onTouchEvent(ev)) { handled = true; } } return handled; }
@Override public boolean onDown(final MotionEvent e) { // Kill any existing fling/scroll mFlingRunnable.stop(false); // Get the item's view that was touched mDownTouchPosition = pointToPosition((int) e.getX(), (int) e.getY()); if (mDownTouchPosition >= 0) { mDownTouchView = getChildAt(mDownTouchPosition - mFirstPosition); mDownTouchView.setPressed(true); } // Reset the multiple-scroll tracking state mIsFirstScroll = true; // Must return true to get matching events for this down event. return true; }
@Override public boolean onFling( final MotionEvent e1, final MotionEvent e2, final float velocityX, final float velocityY) { if (!mShouldCallbackDuringFling) { // We want to suppress selection changes // Remove any future code to set mSuppressSelectionChanged = false removeCallbacks(mDisableSuppressSelectionChangedRunnable); // This will get reset once we scroll into slots if (!mSuppressSelectionChanged) { mSuppressSelectionChanged = true; } } // Fling the Gallery! mFlingRunnable.startUsingVelocity((int) -velocityX); return true; }
@Override public void onFling(float startX, float startY, float velocityX, float velocityY) { if (DEBUG) { LogManager.getLogger() .d( LOG_TAG, "onFling. sX: " + startX + " sY: " + startY + " Vx: " + velocityX + " Vy: " + velocityY); } ImageView imageView = getImageView(); mCurrentFlingRunnable = new FlingRunnable(imageView.getContext()); mCurrentFlingRunnable.fling( getImageViewWidth(imageView), getImageViewHeight(imageView), (int) velocityX, (int) velocityY); imageView.post(mCurrentFlingRunnable); }
/** * Tracks a motion scroll. In reality, this is used to do just about any movement to items (touch * scroll, arrow-key scroll, set an item as selected). * * @param deltaX Change in X from the previous event. */ void trackMotionScroll(final int deltaX) { if (getChildCount() == 0) { return; } final boolean toLeft = deltaX < 0; final int limitedDeltaX = getLimitedMotionScrollAmount(toLeft, deltaX); if (limitedDeltaX != deltaX) { // The above call returned a limited amount, so stop any scrolls/flings mFlingRunnable.endFling(false); onFinishedMovement(); } offsetChildrenLeftAndRight(limitedDeltaX); detachOffScreenChildren(toLeft); if (toLeft) { // If moved left, there will be empty space on the right fillToGalleryRight(); } else { // Similarly, empty space on the left fillToGalleryLeft(); } // Clear unused views mRecycler.clear(); setSelectionToChildClosestToLockPoint(); onScrollChanged(0, 0, 0, 0); // Dummy values, View's implementation does not use these. invalidate(); }
private void cancelFling() { if (null != mCurrentFlingRunnable) { mCurrentFlingRunnable.cancelFling(); mCurrentFlingRunnable = null; } }
private void cancelFling() { if (mCurrentFlingRunnable != null) { mCurrentFlingRunnable.cancelFling(); mCurrentFlingRunnable = null; } }