package com.ToxicBakery.lollipop.demo; import android.app.Activity; import android.app.ActivityOptions; import android.app.ListActivity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.annotation.DrawableRes; import android.support.annotation.IntDef; import android.transition.ChangeImageTransform; import android.transition.Explode; import android.transition.Fade; import android.transition.Slide; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.ImageView; import com.ToxicBakery.lollipop.R; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; public class NewActivityTransitionsActivity extends ListActivity implements AdapterView.OnItemClickListener { private TransitionDemo[] mTransitionDemos = { new TransitionDemo("Explode", TransitionActivity.TRAN_TYPE_EXPLODE), new TransitionDemo("Slide",TransitionActivity.TRAN_TYPE_SLIDE), new TransitionDemo("Fade", TransitionActivity.TRAN_TYPE_FADE), new TransitionDemo("ViewSharing", TransitionActivity.TRAN_TYPE_VIEW_SHARE)}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setListAdapter(new ArrayAdapter<TransitionDemo>(this, android.R.layout.simple_selectable_list_item, mTransitionDemos)); getListView().setOnItemClickListener(this); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(NewActivityTransitionsActivity.this, TransitionActivity.class); Bundle options = ActivityOptions.makeSceneTransitionAnimation(NewActivityTransitionsActivity.this).toBundle(); TransitionDemo demo = (TransitionDemo) parent.getItemAtPosition(position); intent.putExtra(TransitionActivity.EXTRA_TRANSITION_TYPE, demo.mTranType); startActivity(intent, options); } public static class TransitionActivity extends Activity implements AdapterView.OnItemClickListener { public static final String EXTRA_TRANSITION_TYPE = "com.ToxicBakery.lollipop.EXTRA_TRANSITION_TYPE"; @Retention(RetentionPolicy.SOURCE) @IntDef({TRAN_TYPE_VIEW_SHARE, TRAN_TYPE_EXPLODE, TRAN_TYPE_SLIDE, TRAN_TYPE_FADE}) public @interface TRANSITION_TYPE{}; public static final int TRAN_TYPE_EXPLODE = 0; public static final int TRAN_TYPE_SLIDE = 1; public static final int TRAN_TYPE_FADE = 2; public static final int TRAN_TYPE_VIEW_SHARE = 3; private @DrawableRes int[] mDrawables = {R.drawable.whirlpool, R.drawable.zwicky, R.drawable.carina, R.drawable.jet, R.drawable.ngc, R.drawable.butterfly}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Note that this is called before setContentView() setupTransition(); setContentView(R.layout.activity_demo_new_transitions); GridView gridView = (GridView) findViewById(R.id.gridView); gridView.setAdapter(new ImageViewAdapter(this, mDrawables)); gridView.setOnItemClickListener(this); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(this, SharedViewDetailActivity.class); int resId = (int) parent.getItemAtPosition(position); intent.putExtra(SharedViewDetailActivity.EXTRA_IMAGE_RES_ID, resId); Bundle options = ActivityOptions.makeSceneTransitionAnimation(this, view, "sharedImage").toBundle(); startActivity(intent, options); } private void setupTransition() { int transitionType = getIntent().getIntExtra(EXTRA_TRANSITION_TYPE, -1); Window window = getWindow(); window.requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); window.setAllowEnterTransitionOverlap(true); switch (transitionType) { case TRAN_TYPE_EXPLODE: window.setEnterTransition(new Explode()); window.setExitTransition(new Explode()); break; case TRAN_TYPE_SLIDE: window.setEnterTransition(new Slide(Gravity.LEFT)); window.setExitTransition(new Slide(Gravity.RIGHT)); break; case TRAN_TYPE_FADE: window.setEnterTransition(new Fade(Fade.MODE_IN)); window.setExitTransition(new Fade(Fade.MODE_OUT)); break; case TRAN_TYPE_VIEW_SHARE: window.requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS); window.setSharedElementEnterTransition(new ChangeImageTransform()); window.setSharedElementExitTransition(new ChangeImageTransform()); break; } } } private static class ImageViewAdapter extends BaseAdapter { private Context mContext; private @DrawableRes int[] mDrawables; private ImageViewAdapter(Context context, @DrawableRes int[] drawables) { mContext = context; mDrawables = drawables; } @Override public int getCount() { return mDrawables.length; } @Override public Integer getItem(int position) { return mDrawables[position]; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = new ImageView(mContext); } ((ImageView)convertView).setImageResource(mDrawables[position]); return convertView; } } private static class TransitionDemo { private String mName; private @TransitionActivity.TRANSITION_TYPE int mTranType; private TransitionDemo(String mName, @TransitionActivity.TRANSITION_TYPE int mTranType) { this.mName = mName; this.mTranType = mTranType; } @Override public String toString() { return mName; } } public static class SharedViewDetailActivity extends Activity { public static final String EXTRA_IMAGE_RES_ID = "com.ToxicBakery.lollipop"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo_shared_view_detail); ImageView image = (ImageView) findViewById(R.id.imageView); int imageResourceId = getIntent().getIntExtra(EXTRA_IMAGE_RES_ID, -1); image.setImageResource(imageResourceId); } } }