package com.github.florent37.carpaccio.controllers; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.ScrollView; import com.github.florent37.carpaccio.Carpaccio; import com.github.ksoichiro.android.observablescrollview.ObservableScrollView; import com.github.ksoichiro.android.observablescrollview.ObservableScrollViewCallbacks; import com.github.ksoichiro.android.observablescrollview.ScrollState; import com.nineoldandroids.view.ViewHelper; import java.util.HashMap; import java.util.Map; /** * Created by florentchampigny on 22/07/15. */ public class ParallaxViewController { Map<View, Float> viewsToMove = new HashMap<>(); public void registerParallax(View view) { if(view instanceof ScrollView) registerParallax((ScrollView)view, true); else if(view instanceof RecyclerView) registerParallaxRecyclerView((RecyclerView) view); } public void registerParallax(ScrollView view, boolean replaceWithObservableScrollView) { if (replaceWithObservableScrollView && !(view instanceof ObservableScrollView)) { CommonViewController replaceViewController = new CommonViewController(); ObservableScrollView newView = replaceViewController.replaceViewithTagToRemove(view, "com.github.ksoichiro.android.observablescrollview.ObservableScrollView", "registerParallax()"); if (view.getChildCount() > 0) { View scrollViewChild = view.getChildAt(0); view.removeView(scrollViewChild); newView.addView(scrollViewChild); } view = newView; } if (view != null) ((ObservableScrollView) view).setScrollViewCallbacks(new ObservableScrollViewCallbacks() { @Override public void onScrollChanged(int i, boolean b, boolean b1) { scrolled(i); } @Override public void onDownMotionEvent() { } @Override public void onUpOrCancelMotionEvent(ScrollState scrollState) { } }); } public void registerParallaxRecyclerView(RecyclerView recyclerView){ recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { scrolled(recyclerView.computeVerticalScrollOffset()); } }); } public void followScroll(View view) { parallaxY(view, 1); } public void quickReturn(View view) { quickReturnTop(view); } public void quickReturnBottom(View view) { //TODO } public void quickReturnTop(View view) { //TODO } public void parallaxY(View view, float y) { viewsToMove.put(view, y); } public void scrolled(int i) { for (View view : viewsToMove.keySet()) { ViewHelper.setTranslationY(view, i * viewsToMove.get(view)); } } }