/** * Set the view as header. * * @param header The inflated header * @param view The RecyclerView to set scroll listeners */ public void setParallaxHeader(View header, final RecyclerView view) { mRecyclerView = view; mHeader = new CustomRelativeWrapper(header.getContext(), mShouldClipView); mHeader.setLayoutParams( new ViewGroup.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); mHeader.addView( header, new RelativeLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); view.setOnScrollListener( new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (mHeader != null) { translateHeader( mRecyclerView.getLayoutManager().getChildAt(0) == mHeader ? mRecyclerView.computeVerticalScrollOffset() : mHeader.getHeight()); } } }); }
/** * Translates the adapter in Y * * @param of offset in px */ public void translateHeader(float of) { float ofCalculated = of * mScrollMultiplier; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB && of < mHeader.getHeight()) { mHeader.setTranslationY(ofCalculated); } else if (of < mHeader.getHeight()) { TranslateAnimation anim = new TranslateAnimation(0, 0, ofCalculated, ofCalculated); anim.setFillAfter(true); anim.setDuration(0); mHeader.startAnimation(anim); } mHeader.setClipY(Math.round(ofCalculated)); if (mParallaxScroll != null) { final RecyclerView.ViewHolder holder = mRecyclerView.findViewHolderForAdapterPosition(0); float left; if (holder != null) { left = Math.min(1, ((ofCalculated) / (mHeader.getHeight() * mScrollMultiplier))); } else { left = 1; } mParallaxScroll.onParallaxScroll(left, of, mHeader); } }