转载请注明出处 http://blog.csdn.net/qq_31715429/article/details/52710485
本文出自:猴菇先生的博客
Android过渡动画是在api21加入的作用在window的动画,效果如下
1.在style的theme中加上
<item name="android:windowContentTransitions">true</item>
<item name="android:windowAllowEnterTransitionOverlap">false</item>
<item name="android:windowAllowReturnTransitionOverlap">false</item>
2.MainActivity.java:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setWindowAnimation();
findViewById(R.id.next_btn).setOnClickListener(new View.OnClickListener() {
@SuppressWarnings("unchecked")
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, NextActivity.class);
//这两个Pair是设置共享元素,transitionName需要和下一个界面中需要共享的控件设置相同的
ActivityOptionsCompat activityOptionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation
(MainActivity.this, new Pair<>(findViewById(R.id.circle_iv), getString(R.string.share_circle))
, new Pair<>(findViewById(R.id.hello_tv), getString(R.string.share_text)));
startActivity(intent, activityOptionsCompat.toBundle());
}
});
}
private void setWindowAnimation() {
Slide slide = new Slide();//滑动动画
slide.setSlideEdge(Gravity.LEFT);//设置滑出方向
slide.setDuration(500);
getWindow().setReenterTransition(slide);//重新进入
getWindow().setExitTransition(slide);//离开
}
}
3.NextActivity.java:
public class NextActivity extends AppCompatActivity {
private static final int DELAY = 100;
private static final int MODE_IN = 0x1;
private static final int MODE_OUT = 0x2;
private List<Button> btnList = new ArrayList<>();
private LinearLayout mCircularRevealView;//用于展示圆形揭示层的布局
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);
initView();
setWindowAnimation();
findViewById(R.id.back_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finishAfterTransition();//在过渡动画结束后finish
}
});
}
private void setWindowAnimation() {
// Fade fade = new Fade();//渐变动画
// fade.setDuration(500);
// getWindow().setEnterTransition(fade);
Explode explode = new Explode();//分解动画
explode.setDuration(500);
getWindow().setEnterTransition(explode);//进入
Slide slide = new Slide(Gravity.RIGHT);//滑动动画
slide.setDuration(500);
getWindow().setReturnTransition(slide);//返回
TransitionSet transitionSet = new TransitionSet();//过渡动画集合
ChangeBounds tvTran = new ChangeBounds();//共享元素动画
tvTran.setDuration(500);
tvTran.addTarget(findViewById(R.id.hello_tv));
//在xml中inflate动画
Transition circleTran = TransitionInflater.from(this).inflateTransition(R.transition.changebounds_with_arcmotion);
circleTran.addTarget(findViewById(R.id.circle_iv));
transitionSet.addTransition(tvTran).addTransition(circleTran);
//给window设置共享元素动画
getWindow().setSharedElementEnterTransition(transitionSet);
//进入监听
getWindow().getEnterTransition().addListener(new Transition.TransitionListener() {
@Override
public void onTransitionStart(Transition transition) {
//创建圆形揭示层动画
createCircularRevealAnim(MODE_IN);
mCircularRevealView.setBackgroundResource(R.color.base_white);
}
@Override
public void onTransitionEnd(Transition transition) {
//创建按钮缩放动画
for (int i = 0; i < btnList.size(); i++) {
Button btn = btnList.get(i);
//ViewPropertyAnimator,属性动画的简便写法
btn.animate().setStartDelay(i * DELAY).setDuration(500).scaleX(1).scaleY(1);
}
}
@Override
public void onTransitionCancel(Transition transition) {
}
@Override
public void onTransitionPause(Transition transition) {
}
@Override
public void onTransitionResume(Transition transition) {
}
});
//返回监听
getWindow().getReturnTransition().addListener(new Transition.TransitionListener() {
@Override
public void onTransitionStart(Transition transition) {
//创建圆形揭示层动画
createCircularRevealAnim(MODE_OUT);
}
@Override
public void onTransitionEnd(Transition transition) {
}
@Override
public void onTransitionCancel(Transition transition) {
}
@Override
public void onTransitionPause(Transition transition) {
}
@Override
public void onTransitionResume(Transition transition) {
}
});
}
/**
* 创建圆形揭示层动画
*/
private void createCircularRevealAnim(int mode) {
//设置圆心坐标和半径
int mCx = (mCircularRevealView.getLeft() + mCircularRevealView.getRight()) / 2;
int mCy = (mCircularRevealView.getTop() + mCircularRevealView.getBottom()) / 2;
int mRadius = Math.max(mCircularRevealView.getWidth() / 2, mCircularRevealView.getHeight() / 2);
Animator anim;
if (mode == MODE_IN) {
anim = ViewAnimationUtils.createCircularReveal(mCircularRevealView, mCx, mCy, 0, mRadius);
} else {
anim = ViewAnimationUtils.createCircularReveal(mCircularRevealView, mCx, mCy, mRadius, 0);
}
anim.setDuration(500);
anim.start();
}
private void initView() {
mCircularRevealView = (LinearLayout) findViewById(R.id.circular_reveal_view);
Button btn1 = (Button) findViewById(R.id.btn1);
Button btn2 = (Button) findViewById(R.id.btn2);
Button btn3 = (Button) findViewById(R.id.btn3);
Button btn4 = (Button) findViewById(R.id.btn4);
btnList.add(btn1);
btnList.add(btn2);
btnList.add(btn3);
btnList.add(btn4);
}
}
4.changebounds_with_arcmotion.xml
<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:interpolator="@android:interpolator/accelerate_decelerate">
<changeBounds />
<!-- 弧度手势 使得共享元素动画在进行时,路线有一个弧度弯曲-->
<arcMotion
android:maximumAngle="90"
android:minimumHorizontalAngle="90"
android:minimumVerticalAngle="0" />
</transitionSet>