package com.mozu.mozuandroidinstoreassistant.app; import android.animation.Animator; import android.animation.ObjectAnimator; import android.animation.TimeInterpolator; import android.app.Activity; import android.content.pm.ActivityInfo; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Build; import android.os.Bundle; import android.support.v4.view.ViewPager; import android.view.ViewTreeObserver; import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.widget.FrameLayout; import com.mozu.mozuandroidinstoreassistant.app.product.adapter.ProductImagesPagerAdapter; import com.mozu.mozuandroidinstoreassistant.app.views.ZoomOutPageTransformer; import java.util.ArrayList; public class ImagePagerActivity extends Activity implements ViewTreeObserver.OnPreDrawListener { private static final TimeInterpolator sDecelerator = new DecelerateInterpolator(); private static final TimeInterpolator sAccelerator = new AccelerateInterpolator(); private static final int ANIM_DURATION = 250; public static final String IMAGE_URLS_FOR_PRODUCTS = "IMAGE_URLS_FOR_PRODUCTS"; public static final String IMAGE_PAGER_INDEX = "IMAGE_PAGER_INDEX"; public static final String ANIM_START_LEFT = "ANIM_START_LEFT"; public static final String ANIM_START_TOP = "ANIM_START_TOP"; public static final String ANIM_START_WIDTH = "ANIM_START_WIDTH"; public static final String ANIM_START_HEIGHT = "ANIM_START_HEIGHT"; private ViewPager mPager; private ProductImagesPagerAdapter mPagerAdapter; private ArrayList<String> mImagesUrls; private int mIndex; private int mAnimStartLeft; private int mAnimStartTop; private int mAnimStartWidth; private int mAnimStartHeight; private float mLeftDelta; private float mTopDelta; private float mWidthScale; private float mHeightScale; private FrameLayout mTopLevelLayout; private ColorDrawable mBackground; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (!getResources().getBoolean(R.bool.allow_portrait)) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } setContentView(R.layout.activity_image_list); mTopLevelLayout = (FrameLayout) findViewById(R.id.top_level_layout); mBackground = new ColorDrawable(Color.BLACK); if (Build.VERSION.SDK_INT >= 16) { mTopLevelLayout.setBackground(mBackground); // Fade in the black background ObjectAnimator bgAnim = ObjectAnimator.ofInt(mBackground, "alpha", 0, 200); bgAnim.setDuration(ANIM_DURATION); bgAnim.start(); } else { mTopLevelLayout.setBackgroundColor(getResources().getColor(R.color.semi_transparent_image_view_background)); } mPager = (ViewPager) findViewById(R.id.product_viewpager); setupActivityFromInstanceOrIntent(savedInstanceState); mPagerAdapter = new ProductImagesPagerAdapter(getFragmentManager(), mImagesUrls); mPager.setAdapter(mPagerAdapter); mPager.setCurrentItem(mIndex); mPager.setPageTransformer(true, new ZoomOutPageTransformer()); } @Override public void finish() { super.finish(); overridePendingTransition(0, 0); } @Override public void onBackPressed() { runExitAnimation(new Runnable() { public void run() { // *Now* go ahead and exit the activity finish(); } }); } private void setupActivityFromInstanceOrIntent(Bundle savedInstanceState) { if (savedInstanceState != null && savedInstanceState.getStringArrayList(IMAGE_URLS_FOR_PRODUCTS) != null) { mImagesUrls = savedInstanceState.getStringArrayList(IMAGE_URLS_FOR_PRODUCTS); } else if (getIntent() != null && getIntent().getStringArrayListExtra(IMAGE_URLS_FOR_PRODUCTS) != null) { mImagesUrls = getIntent().getStringArrayListExtra(IMAGE_URLS_FOR_PRODUCTS); } if (getIntent() != null) { mIndex = getIntent().getIntExtra(IMAGE_PAGER_INDEX, 0); } if (savedInstanceState != null && mIndex == 0) { mIndex = savedInstanceState.getInt(IMAGE_PAGER_INDEX, 0); } //load animation related things for first launch if (getIntent() != null && savedInstanceState == null) { mAnimStartLeft = getIntent().getIntExtra(ANIM_START_LEFT, 0); mAnimStartTop = getIntent().getIntExtra(ANIM_START_TOP, 0); mAnimStartWidth = getIntent().getIntExtra(ANIM_START_WIDTH, 0); mAnimStartHeight = getIntent().getIntExtra(ANIM_START_HEIGHT, 0); if (savedInstanceState == null) { ViewTreeObserver observer = mPager.getViewTreeObserver(); observer.addOnPreDrawListener(this); } } } @Override protected void onSaveInstanceState(Bundle outState) { outState.putStringArrayList(IMAGE_URLS_FOR_PRODUCTS, mImagesUrls); outState.putInt(IMAGE_PAGER_INDEX, mPager.getCurrentItem()); super.onSaveInstanceState(outState); } @Override public boolean onPreDraw() { mPager.getViewTreeObserver().removeOnPreDrawListener(ImagePagerActivity.this); int [] screenLoacation = new int[2]; mPager.getLocationOnScreen(screenLoacation); mLeftDelta = mAnimStartLeft - screenLoacation[0]; mTopDelta = mAnimStartTop - screenLoacation[1]; mWidthScale = (float) mAnimStartWidth / mPager.getMeasuredWidth(); mHeightScale = (float) mAnimStartHeight / mPager.getMeasuredHeight(); runEnterAnimation(); return true; } private void runEnterAnimation() { final long duration = (long) ANIM_DURATION; // Set starting values for properties we're going to animate. These // values scale and position the full size version down to the thumbnail // size/location, from which we'll animate it back up mPager.setPivotX(0); mPager.setPivotY(0); mPager.setScaleX(mWidthScale); mPager.setScaleY(mHeightScale); mPager.setTranslationX(mLeftDelta); mPager.setTranslationY(mTopDelta); // Animate scale and translation to go from thumbnail to full size mPager.animate().setDuration(duration). scaleX(1).scaleY(1). translationX(0).translationY(0). setInterpolator(sDecelerator); } public void runExitAnimation(final Runnable endAction) { final long duration = (long) ANIM_DURATION; mPager.setPivotX(mPager.getWidth() / 2); mPager.setPivotY(mPager.getHeight() / 2); mLeftDelta = 0; mTopDelta = 0; mPager.animate().setDuration(duration). scaleX(mWidthScale).scaleY(mHeightScale). translationX(mLeftDelta).translationY(mTopDelta). setListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { endAction.run(); } @Override public void onAnimationCancel(Animator animation) { endAction.run(); } @Override public void onAnimationRepeat(Animator animation) { } }); mPager.animate().alpha(0); } }