private void initPin(View child) { mPinInizialized = true; View pin = child.findViewById(R.id.pin); if (mIsCenteredVertical) { centerVerticalPin(child); } updatePinContent(child); if (pin instanceof TextView) mBaseColor = ((TextView) pin).getCurrentTextColor(); if (mFadeEffect) { setAlpha(child); } }
private void updatePinContent(View container) { ItemPinned itemPinned = ((PinnedAdapter) mAdapter).getItem(mLayoutManager.findFirstVisibleItemPosition()); View view = container.findViewById(R.id.pin); if (view instanceof TextView) changeText((TextView) view, (TextItemPinned) itemPinned); else if (view instanceof ImageView) changeImage((ImageView) view, (ImageItemPinned) itemPinned); }
@Override public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) { if (target instanceof RecyclerView) { if (!mPinInizialized) initPin(child); if (child.getVisibility() == View.INVISIBLE) child.setVisibility(View.VISIBLE); } mCurrentDirection = dy > 0 ? DIRECTION_UP : DIRECTION_DOWN; }
private void updateView(View child, View target, int dy) { boolean isLastItem = isLastItemGroup(); if (isLastItem) { mVerticalScrollOffset = ((RecyclerView) target).computeVerticalScrollOffset(); int newOffset = mVerticalScrollOffset % mItemHeight; int increment = newOffset - mCurrentOffset; mCurrentOffset = newOffset; child.offsetTopAndBottom(-increment); if (mFadeEffect) setAlpha(child); if (mCurrentDirection == DIRECTION_DOWN || (mCurrentDirection == DIRECTION_UP && increment < 0)) { updatePinContent(child); } } else { if (mCurrentOffset != 0 || dy > mItemHeight) { if (mCurrentOffset != 0) { child.offsetTopAndBottom(mCurrentOffset); mCurrentOffset = 0; if (mFadeEffect) removeAlpha(child); } updatePinContent(child); } } }
if (restoredInstance) { restoredInstance = false; updateView(child, recyclerView, mVerticalScrollOffset - recyclerView.computeVerticalScrollOffset()); setAlpha(child);
@Override public void onNestedScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { if (target instanceof RecyclerView) { updateView(child, target, dyConsumed); } }
@Override public void onRestoreInstanceState(CoordinatorLayout parent, View child, Parcelable state) { SavedState ss = (SavedState) state; super.onRestoreInstanceState(parent, child, ss.getSuperState()); restoredInstance = true; mCurrentOffset = ss.currentOffset; mPinInizialized = ss.labelInitialized; mCurrentImage = ss.currentImage; mFirstLayout = ss.isFirstLayout; mVerticalScrollOffset = ss.verticalScrollOffset; if (mPinInizialized) { child.setVisibility(View.VISIBLE); View v = child.findViewById(R.id.pin); if (v instanceof TextView) { ((TextView) v).setText(ss.currentText); } else if (v instanceof ImageView) { if (mCurrentImage != 0) { ((ImageView) v).setImageResource(mCurrentImage); } } } mFadeEffect = ss.isFadeEnabled; mBaseColor = ss.baseColor; mItemHeight = ss.itemHeight; mIsCenteredVertical = ss.isCenteredVertical; mRelativeOffset = ss.relOffset; if (mIsCenteredVertical) { centerVerticalPin(child); } }
private void setIndicatorAnimation() { CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mPinLayout.getLayoutParams(); mBehavior = new PinBehavior(mFadeEffect, mPinVerticalPosition == PIN_GRAVITY_CENTER); params.setBehavior(mBehavior); mPinLayout.requestLayout(); }
@Override public boolean onNestedPreFling(CoordinatorLayout coordinatorLayout, final View child, View target, float velocityX, float velocityY) { if (target instanceof RecyclerView) { if (!mPinInizialized) initPin(child); if (child.getVisibility() == View.INVISIBLE) child.setVisibility(View.VISIBLE); mCurrentDirection = velocityY > 0 ? DIRECTION_UP : DIRECTION_DOWN; ((RecyclerView) target).clearOnScrollListeners(); ((RecyclerView) target).addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { updateView(child, recyclerView, dy); } @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { if (newState == RecyclerView.SCROLL_STATE_IDLE) { if (recyclerView.computeVerticalScrollOffset() == 0) { mVerticalScrollOffset = 0; child.setVisibility(View.INVISIBLE); } updatePinContent(child); recyclerView.clearOnScrollListeners(); } } }); } return false; }