Ejemplo n.º 1
0
  /**
   * 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;
  }
Ejemplo n.º 2
0
  @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);
  }
Ejemplo n.º 3
0
  /**
   * 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();
    }
  }
Ejemplo n.º 4
0
  @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;
  }
Ejemplo n.º 6
0
  @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;
  }
Ejemplo n.º 7
0
  @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;
  }
Ejemplo n.º 8
0
 @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);
 }
Ejemplo n.º 9
0
  /**
   * 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();
  }
Ejemplo n.º 10
0
 private void cancelFling() {
   if (null != mCurrentFlingRunnable) {
     mCurrentFlingRunnable.cancelFling();
     mCurrentFlingRunnable = null;
   }
 }
Ejemplo n.º 11
0
 private void cancelFling() {
   if (mCurrentFlingRunnable != null) {
     mCurrentFlingRunnable.cancelFling();
     mCurrentFlingRunnable = null;
   }
 }