Android 切换 Activity 时的动画

过渡形式启动一个 Activity:
ActivityOptions 类中有很多切换 Activity 相关的过渡动画,场景切换、放大动画、揭露动画、自定义动画等。
用法:

options = ActivityOptions.makexx();    
startActivity(intent, options.toBundle());

进出过渡

有三个类,explodeslidefade ,都继承 Visibility,而 Visibility 继承 Transition 。

trasition 动画效果
explode 从场景的中心进出
slide 从场景的一边进出,指定 slideEdge 决定哪一边
fade 在场景中改变透明度的方式
  1. 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>
  1. 代码中动态配置动画效果
// /java/…/MainActivity.java    
//开启 window content transitions 
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); 
//指定进入退出过渡动画 
//为了完整的效果,在被调用的 Activity 中也要启用 window content transitions 
getWindow().setEnterTransition(new Explode()); 
getWindow().setExitTransition(new Explode());
explode
slide
fade

共享元素过渡

transition 动画效果
changeBounds 移动、缩小、放大
changeTransform 缩小、旋转视图
changeImageTransform 改变大小、缩放图片
  1. 定义一个 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>
  1. 应用到主题中
    动态方法配置
<!-- /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();
  1. 在有相同元素的布局文件中,为相同的视图声明 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()

  1. 使用 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();
          }
      });
    }
    
shared_element

有多个共享元素时

使用 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容