过渡形式启动一个 Activity:
ActivityOptions 类中有很多切换 Activity 相关的过渡动画,场景切换、放大动画、揭露动画、自定义动画等。
用法:
options = ActivityOptions.makexx();
startActivity(intent, options.toBundle());
进出过渡
有三个类,explode
、 slide
、 fade
,都继承 Visibility,而 Visibility 继承 Transition 。
trasition | 动画效果 |
---|---|
explode | 从场景的中心进出 |
slide | 从场景的一边进出,指定 slideEdge 决定哪一边 |
fade | 在场景中改变透明度的方式 |
- xml形式静态配置动画
<!-- /res/values/styles.xml -->
<!--开启 window content transitions-->
<item name="android:windowContentTransitions">true</item>
<!--指定进入退出过渡动画-->
<item name="android:windowEnterTransition">@transition/explode</item>
<item name="android:windowExitTransition">@transition/explode</item>
<!-- /res/transition/explode.xml -->
<transitionSet
xmlns:android="http://schemas.android.com/apk/res/android">
<explode/>
</transitionSet>
- 代码中动态配置动画效果
// /java/…/MainActivity.java
//开启 window content transitions
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
//指定进入退出过渡动画
//为了完整的效果,在被调用的 Activity 中也要启用 window content transitions
getWindow().setEnterTransition(new Explode());
getWindow().setExitTransition(new Explode());
共享元素过渡
transition | 动画效果 |
---|---|
changeBounds | 移动、缩小、放大 |
changeTransform | 缩小、旋转视图 |
changeImageTransform | 改变大小、缩放图片 |
- 定义一个 transition 资源文件
<!-- res/transition/shared_element_transition.xml -->
<?xml version="1.0" encoding="utf-8"?>
<changeBounds xmlns:android="http://schemas.android.com/apk/res/android" >
<arcMotion
android:minimumHorizontalAngle="0"
android:minimumVerticalAngle="15"
android:maximumAngle="90" />
</changeBounds>
- 应用到主题中
动态方法配置
<!-- /res/values/styles -->
<item name="android:windowSharedElementExitTransition">@transition/shared_element_transition</item>
<item name="android:windowSharedElementEnterTransition">@transition/shared_element_transition</item>
代码中动态方法配置
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().setSharedElementExitTransition();
getWindow().setSharedElementEnterTransition();
- 在有相同元素的布局文件中,为相同的视图声明 android:transitionName 属性。(名称相同)
<!-- activity_main.xml -->
...
<ImageView
android:id="@+id/image"
android:transitionName="google"
... />
...
<!-- activity_another.xml -->
...
<ImageView
android:transitionName="google"
android:id="@+id/image"
... />
...
或者代码中动态配置:调用 View.setTransitionName()
。
-
使用 ActivityOptions.makeSceneTransitionAnimation() 方法应用过渡动画
// MainActivity.java private ImageView image; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); image = (ImageView) findViewById(R.id.image); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, AnotherActivity.class); ActivityOptions options = ActivityOptions. makeSceneTransitionAnimation(MainActivity.this, image, "google"); startActivity(intent,options.toBundle()); } }); } // SecondActivity.java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_another); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //使用这个方法代替 finishActivity(),确保 Transition 完成之后再结束 Activity finishAfterTransition(); } }); }
有多个共享元素时
使用 ActivityOptions.makeSceneTransitionAnimation(activity, pair…) 方法:
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(MainActivity.this,
Pair.create((View) image, "google"),
Pair.create((View) button, "btnSwitch"));
参考 https://developer.android.com/training/material/animations.html