package com.cheng.animationstudy.activity; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.ActionMode; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.FrameLayout; import android.widget.LinearLayout; import com.cheng.animationstudy.R; import com.cheng.animationstudy.customview.viewnatruetransition.CustomAnimator; import com.cheng.utils.ViewFinder; import java.util.Arrays; /** * 选择控件与选择界面自然过渡效果的实现 */ public class ViewNatrueTransitionAnimActivity extends AppCompatActivity { private FrameLayout mMainContainerFL; private FrameLayout mEditModeContainerFL; private View mLocalFromView; private View mLocalToView; private View mDateFromView; private View mDateToView; private LinearLayout mFirstGroupLL; private LinearLayout mSecondGroupLL; private LinearLayout mThirdGroupLL; private View mFirstSpacerView; private ActionMode mActionMode; private int mHalfHeight; private CustomAnimator mCustomAnimator = new CustomAnimator(); private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.menu_viewnatruetaansition_mode, menu); return true; } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.done: mCustomAnimator.prepareRevert(); mCustomAnimator.start(); mode.finish(); return true; default: return false; } } @Override public void onDestroyActionMode(ActionMode mode) { mCustomAnimator.prepareRevert(); mCustomAnimator.start(); mActionMode = null; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final View view = getLayoutInflater().inflate(R.layout.activity_viewnatruetransitionanim, null); view.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { v.removeOnLayoutChangeListener(this); mHalfHeight = view.getHeight() / 2; mEditModeContainerFL.setTranslationY(mHalfHeight); mEditModeContainerFL.setAlpha(0f); mCustomAnimator.setEditModeHalfHeight(mHalfHeight); } }); setContentView(view); initView(); initListener(); } private void initView() { this.mMainContainerFL = ViewFinder.findViewById(this, R.id.main_container); this.mFirstGroupLL = ViewFinder.findViewById(this, R.id.first_group_container); this.mSecondGroupLL = ViewFinder.findViewById(this, R.id.second_group_container); this.mThirdGroupLL = ViewFinder.findViewById(this, R.id.third_group_container); this.mLocalFromView = ViewFinder.findViewById(this, R.id.localfrom); this.mLocalToView = ViewFinder.findViewById(this, R.id.localto); this.mFirstSpacerView = ViewFinder.findViewById(this, R.id.first_spacer); this.mDateFromView = ViewFinder.findViewById(this, R.id.datefrom); this.mDateToView = ViewFinder.findViewById(this, R.id.dateto); } private void initListener() { this.mLocalFromView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mActionMode = startActionMode(mActionModeCallback); mCustomAnimator.setAnimatorViews(mMainContainerFL, mLocalFromView, mFirstGroupLL, Arrays.asList(new View[]{mSecondGroupLL, mFirstSpacerView, mThirdGroupLL}), null, mEditModeContainerFL, Arrays.asList(new View[]{})); mCustomAnimator.prepareAnimation(); mCustomAnimator.start(); } }); this.mLocalToView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mActionMode = startActionMode(mActionModeCallback); mCustomAnimator.setAnimatorViews(mMainContainerFL, mLocalToView, mFirstGroupLL, Arrays.asList(new View[]{mSecondGroupLL, mFirstSpacerView, mThirdGroupLL}), null, mEditModeContainerFL, Arrays.asList(new View[]{})); mCustomAnimator.prepareAnimation(); mCustomAnimator.start(); } }); this.mDateFromView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mActionMode = startActionMode(mActionModeCallback); mCustomAnimator.setAnimatorViews(mMainContainerFL, mDateFromView, mSecondGroupLL, Arrays.asList(new View[]{mThirdGroupLL}), null, mEditModeContainerFL, Arrays.asList(new View[]{mFirstGroupLL, mFirstSpacerView})); mCustomAnimator.prepareAnimation(); mCustomAnimator.start(); } }); this.mDateToView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mActionMode = startActionMode(mActionModeCallback); mCustomAnimator.setAnimatorViews(mMainContainerFL, mDateToView, mSecondGroupLL, Arrays.asList(new View[]{mThirdGroupLL}), null, mEditModeContainerFL, Arrays.asList(new View[]{mFirstGroupLL, mFirstSpacerView})); mCustomAnimator.prepareAnimation(); mCustomAnimator.start(); } }); mEditModeContainerFL = (FrameLayout) findViewById(R.id.edit_mode_container); } @Override public void onBackPressed() { mCustomAnimator.prepareAnimation(); mCustomAnimator.start(); super.onBackPressed(); } }