package com.github.takahirom.materialelement.motion.choreography; import android.animation.Animator; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.support.design.widget.CollapsingToolbarLayout; import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.content.ContextCompat; import android.support.v4.graphics.drawable.RoundedBitmapDrawable; import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; import android.support.v4.util.Pair; import android.support.v4.view.animation.LinearOutSlowInInterpolator; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.CardView; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.transition.Scene; import android.transition.Transition; import android.transition.TransitionInflater; import android.transition.TransitionManager; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.ViewAnimationUtils; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.widget.Button; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.PopupWindow; import android.widget.TextView; import android.widget.Toast; import com.github.takahirom.materialelement.MaterialElementActivity; import com.github.takahirom.materialelement.animation.OnetimeViewTreeObserver; import com.github.takahirom.materialelement.animation.transition.TransitionUtils; import com.github.takahirom.materialelement.main.AnimateRecyclerAdapter; import com.github.takahirom.materialelement.main.ImplementationItem; import com.github.takahirom.materialelement.R; import com.github.takahirom.materialelement.util.AndroidVersionUtil; import com.github.takahirom.materialelement.util.ScreenUtil; import com.github.takahirom.materialelement.view.ResourceUtil; public class ChoreographyActivity extends MaterialElementActivity { public final static String RESULT_EXTRA_ITEM_ID = "RESULT_EXTRA_ITEM_ID"; public static final String INTENT_EXTRA_ITEM = "item"; private ImplementationItem item; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_choreography); item = getIntent().getParcelableExtra(INTENT_EXTRA_ITEM); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); setupViews(); } public void setupViews() { final CollapsingToolbarLayout collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar); final ImageView imageView = (ImageView) findViewById(R.id.detail_image); // collapsingToolbarLayout.setExpandedTitleColor(ContextCompat.ChoreographyActivity.this, android.R.color.white)); final ImageView allShareRowImage = (ImageView) findViewById(R.id.all_element_share_image); final ImageView fewShareImage = (ImageView) findViewById(R.id.few_element_share_image); imageView.setImageResource(item.imageRes); Bitmap bitmap = ResourceUtil.getBitmap(this, item.imageRes); RoundedBitmapDrawable circularBitmapDrawable = RoundedBitmapDrawableFactory.create(getResources(), bitmap); circularBitmapDrawable.setCircular(true); allShareRowImage.setImageDrawable(circularBitmapDrawable); fewShareImage.setImageDrawable(circularBitmapDrawable); TransitionUtils.setSharedElementEnterTransitionEndListenerCompat(getWindow(), new TransitionUtils.OnSharedElementEnterTransitionEndListener() { @Override public void onEnd(Transition transition) { collapsingToolbarLayout.setTitleEnabled(true); collapsingToolbarLayout.setTitle(item.title); } }); setupAllElementShared(allShareRowImage); setupFewElementsAreShared(fewShareImage); setupCreation(); setupChoreographingSurfaces(); setupRadicalReaction(); } private void setupRadicalReaction() { final CardView cardView = (CardView) findViewById(R.id.radical_reaction_card); cardView.setOnTouchListener(new View.OnTouchListener() { int colorIndex = 0; @Override public boolean onTouch(View v, MotionEvent event) { int endRadius = (int) (1.41421 * v.getWidth()); if (event.getAction() == MotionEvent.ACTION_DOWN) { if (!AndroidVersionUtil.isGreaterThanL()) { Toast.makeText(ChoreographyActivity.this, R.string.all_not_support_os_version, Toast.LENGTH_LONG).show(); return false; } if (cardView.getChildCount() > 2) { cardView.removeViewAt(0); } View view = new View(ChoreographyActivity.this); cardView.addView(view, new CardView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); int colors[] = new int[]{R.color.colorAccent, R.color.colorPrimary, R.color.colorPrimaryDark}; view.setBackgroundColor(ContextCompat.getColor(ChoreographyActivity.this, colors[(colorIndex++) % colors.length])); Animator circularReveal = ViewAnimationUtils.createCircularReveal(view, (int) event.getX(), (int) event.getY(), 0, endRadius); circularReveal.start(); } return false; } }); } private void setupAllElementShared(final ImageView rowImage) { final CardView cardView = (CardView) findViewById(R.id.all_element_share_card); cardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final Intent intent = new Intent(ChoreographyActivity.this, ShareAllElementActivity.class); final ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(ChoreographyActivity.this, cardView, getString(R.string.transition_name_all_element_share)); ActivityCompat.startActivity(ChoreographyActivity.this, intent, optionsCompat.toBundle()); } }); cardView.setOnLongClickListener(new View.OnLongClickListener() { boolean isScene1 = true; @Override public boolean onLongClick(View v) { if (AndroidVersionUtil.isGreaterThanL()) { final Scene scene = Scene.getSceneForLayout(cardView, isScene1 ? R.layout.all_element_share_scene2 : R.layout.all_element_share_scene1, ChoreographyActivity.this); final Transition transition = TransitionInflater.from(ChoreographyActivity.this).inflateTransition(isScene1 ? R.transition.choreography_all_element_share_enter : R.transition.choreography_all_element_share_return); TransitionManager.go(scene, transition); ((ImageView) scene.getSceneRoot().findViewById(R.id.all_element_share_image)).setImageDrawable(rowImage.getDrawable()); isScene1 = !isScene1; } else { Toast.makeText(ChoreographyActivity.this, R.string.all_not_support_os_version, Toast.LENGTH_LONG).show(); } return true; } }); } private void setupFewElementsAreShared(final ImageView fewShareImage) { final CardView cardView = (CardView) findViewById(R.id.few_element_share_card); cardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final Intent intent = new Intent(ChoreographyActivity.this, ShareFewElementActivity.class); final ActivityOptionsCompat optionsCompat; if (AndroidVersionUtil.isGreaterThanM()) { optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(ChoreographyActivity.this, Pair.create((View) cardView, getString(R.string.transition_name_few_element_share)), Pair.create(cardView.findViewById(R.id.few_element_share_image), getString(R.string.transition_name_few_element_share_image)) ); }else{ // FIXME: strange behavior on lollipop when use child shared element // Probably cant animate child view optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(ChoreographyActivity.this, Pair.create((View) cardView, getString(R.string.transition_name_few_element_share)) ); } ActivityCompat.startActivity(ChoreographyActivity.this, intent, optionsCompat.toBundle()); } }); cardView.setOnLongClickListener(new View.OnLongClickListener() { boolean isScene1 = true; @Override public boolean onLongClick(View v) { if (AndroidVersionUtil.isGreaterThanL()) { final Scene scene = Scene.getSceneForLayout(cardView, isScene1 ? R.layout.few_element_share_scene2 : R.layout.few_element_share_scene1, ChoreographyActivity.this); final Transition transition = TransitionInflater.from(ChoreographyActivity.this).inflateTransition(R.transition.choreography_few_element_share_enter); TransitionManager.go(scene, transition); ((ImageView) scene.getSceneRoot().findViewById(R.id.few_element_share_image)).setImageDrawable(fewShareImage.getDrawable()); } else { Toast.makeText(ChoreographyActivity.this, R.string.all_not_support_os_version, Toast.LENGTH_LONG).show(); } isScene1 = !isScene1; return true; } }); } private void setupCreation() { findViewById(R.id.new_surface).setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View view) { final CardView contentView = new CardView(ChoreographyActivity.this); contentView.setUseCompatPadding(true); final TextView textView = new TextView(ChoreographyActivity.this); textView.setText("sample"); contentView.addView(textView); int dp8 = (int) ScreenUtil.dp2px(8, ChoreographyActivity.this); ((CardView.LayoutParams) textView.getLayoutParams()).setMargins(dp8, dp8, dp8, dp8); final int dp80 = (int) ScreenUtil.dp2px(80, ChoreographyActivity.this); final PopupWindow popupWindow = new PopupWindow(contentView, dp80, dp80, true); popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); popupWindow.setOutsideTouchable(true); popupWindow.showAsDropDown(view); contentView.getLayoutParams().height = 0; contentView.getLayoutParams().width = 0; ((FrameLayout.LayoutParams) contentView.getLayoutParams()).gravity = Gravity.TOP; OnetimeViewTreeObserver.addOnPreDrawListener(contentView, new OnetimeViewTreeObserver.OnPreDrawListener() { @Override public void onPreDraw() { android.support.transition.TransitionManager.beginDelayedTransition(contentView, new android.support.transition.ChangeBounds() .setInterpolator(new LinearOutSlowInInterpolator())); contentView.getLayoutParams().height = dp80; contentView.getLayoutParams().width = dp80; } }); } }); } private void setupChoreographingSurfaces() { final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(this) { @Override public boolean canScrollVertically() { return false; } }); Button button = (Button) findViewById(R.id.start_choreographing_surfaces_button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { recyclerView.setAdapter(new AnimateRecyclerAdapter()); } }); } @Override public void onBackPressed() { setResultAndFinish(); } void setResultAndFinish() { final Intent resultData = new Intent(); resultData.putExtra(RESULT_EXTRA_ITEM_ID, item.itemId); setResult(RESULT_OK, resultData); ActivityCompat.finishAfterTransition(this); } }