@Override public View getView() { return mViewAdapter.getView(); }
protected ObjectAnimator createBounceBackAnimator(float startOffset) { final View view = mViewAdapter.getView(); // Duration is proportional to the view's size. float bounceBackDuration = (Math.abs(startOffset) / mAnimAttributes.mMaxOffset) * MAX_BOUNCE_BACK_DURATION_MS; ObjectAnimator bounceBackAnim = ObjectAnimator.ofFloat(view, mAnimAttributes.mProperty, mStartAttr.mAbsOffset); bounceBackAnim.setDuration(Math.max((int) bounceBackDuration, MIN_BOUNCE_BACK_DURATION_MS)); bounceBackAnim.setInterpolator(mBounceBackInterpolator); bounceBackAnim.addUpdateListener(this); return bounceBackAnim; } }
@Before public void setUp() throws Exception { mView = mock(View.class); mViewAdapter = mock(IOverScrollDecoratorAdapter.class); when(mViewAdapter.getView()).thenReturn(mView); mStateListener = mock(IOverScrollStateListener.class); mUpdateListener = mock(IOverScrollUpdateListener.class); }
@Before public void setUp() throws Exception { mView = mock(View.class); mViewAdapter = mock(IOverScrollDecoratorAdapter.class); when(mViewAdapter.getView()).thenReturn(mView); mStateListener = mock(IOverScrollStateListener.class); mUpdateListener = mock(IOverScrollUpdateListener.class); }
@Override public boolean handleMoveTouchEvent(MotionEvent event) { final View view = mViewAdapter.getView(); if (!mMoveAttr.init(view, event)) { return false; } // Has over-scrolling officially started? if ((mViewAdapter.isInAbsoluteStart() && mMoveAttr.mDir) || (mViewAdapter.isInAbsoluteEnd() && !mMoveAttr.mDir)) { // Save initial over-scroll attributes for future reference. mStartAttr.mPointerId = event.getPointerId(0); mStartAttr.mAbsOffset = mMoveAttr.mAbsOffset; mStartAttr.mDir = mMoveAttr.mDir; issueStateTransition(mOverScrollingState); return mOverScrollingState.handleMoveTouchEvent(event); } return false; }
protected Animator createAnimator() { final View view = mViewAdapter.getView(); mAnimAttributes.init(view); // Set up a low-duration slow-down animation IN the drag direction. // Exception: If wasn't dragging in 'forward' direction (or velocity=0 -- i.e. not dragging at all), // skip slow-down anim directly to the bounce-back. if (mVelocity == 0f || (mVelocity < 0 && mStartAttr.mDir) || (mVelocity > 0 && !mStartAttr.mDir)) { return createBounceBackAnimator(mAnimAttributes.mAbsOffset); } // dt = (Vt - Vo) / a; Vt=0 ==> dt = -Vo / a float slowdownDuration = -mVelocity / mDecelerateFactor; slowdownDuration = (slowdownDuration < 0 ? 0 : slowdownDuration); // Happens in counter-direction dragging // dx = (Vt^2 - Vo^2) / 2a; Vt=0 ==> dx = -Vo^2 / 2a float slowdownDistance = -mVelocity * mVelocity / mDoubleDecelerateFactor; float slowdownEndOffset = mAnimAttributes.mAbsOffset + slowdownDistance; ObjectAnimator slowdownAnim = createSlowdownAnimator(view, (int) slowdownDuration, slowdownEndOffset); // Set up the bounce back animation, bringing the view back into the original, pre-overscroll position (translation=0). ObjectAnimator bounceBackAnim = createBounceBackAnimator(slowdownEndOffset); // Play the 2 animations as a sequence. AnimatorSet wholeAnim = new AnimatorSet(); wholeAnim.playSequentially(slowdownAnim, bounceBackAnim); return wholeAnim; }
final View view = mViewAdapter.getView(); if (!mMoveAttr.init(view, event)) {