package redstar.onboarding.adapter; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.view.ViewPager; import android.view.View; import android.widget.ImageView; import java.util.ArrayList; import java.util.List; /** * Created by Eoin on 8/8/16. */ public class SceneTransformer implements ViewPager.PageTransformer { public interface SceneChangeListener { void enterScene(@Nullable ImageView sharedElement, float position); void centerScene(@Nullable ImageView sharedElement); void exitScene(@Nullable ImageView sharedElement, float position); void notInScene(); } private List<SceneChangeListener> mSceneChangeListeners = new ArrayList<>(); private ImageView mSharedElement; public void transformPage(@NonNull View view, float position) { //cancel view pagers natural scroll view.setTranslationX(view.getWidth() * -position); for (int scene = 0; scene < mSceneChangeListeners.size(); scene++) { // get the shared element from the first fragment if (view.getTag().equals(0) && mSharedElement == null) { mSharedElement = (ImageView) view.findViewWithTag("shared_element"); } // callback to fragment based on the tag set when the fragment is created if (view.getTag().equals(scene)) { makeSceneCallbacks(mSceneChangeListeners.get(scene), position); } } } public void addSceneChangeListener(@NonNull SceneChangeListener sceneChangeListener) { mSceneChangeListeners.add(sceneChangeListener); } private void makeSceneCallbacks(SceneChangeListener sceneChangeListener, float position) { if (centerScene(position)) { sceneChangeListener.centerScene(mSharedElement); } else if (enterScene(position)) { sceneChangeListener.enterScene(mSharedElement, position); } else if (exitScene(position)) { sceneChangeListener.exitScene(mSharedElement, position); } else if (notInScene(position)) { sceneChangeListener.notInScene(); } } private boolean centerScene(float position) { return position == 0.0F; } private boolean exitScene(float position) { return position > -1.0f && position < 0.0f; } private boolean enterScene(float position) { return position < 1.0f && position > 0; } private boolean notInScene(float position) { return position <= -1.0F || position >= 1.0F; } }