Activity過渡動畫的實現(xiàn)方法

1.使用overridePendingTransition方法實現(xiàn)Activity跳轉(zhuǎn)動畫
overridePendingTransition方法是Activity中提供的Activity跳轉(zhuǎn)動畫方法,通過該方法可以實現(xiàn)Activity跳轉(zhuǎn)時的動畫效果,簡單例子如下:

Intent intent =newIntent(MainActivity.this, SecondActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.slide_in_left, R.anim.slide_in_left);

注意:overridePendingTransition在startActivity或者是finish方法立刻執(zhí)行才有效

2、使用style的方式定義Activity的切換動畫
(1)定義Application的style

 <!-- 系統(tǒng)Application定義 -->
<application    Android:allowBackup="true"
 Android:icon="@mipmap/ic_launcher" 
 Android:label="@string/app_name" 
 Android:supportsRtl="true" 
 Android:theme="@style/AppTheme">

(2)定義具體的AppTheme樣式其中這里的windowAnimationStyle就是我們定義Activity切換動畫的style。而@anim/slide_in_top就是我們定義的動畫文件,也就是說通過為Appliation設(shè)置style,然后為windowAnimationStyle設(shè)置動畫文件就可以全局的為Activity的跳轉(zhuǎn)配置動畫效果。

  <!-- Base application theme. --> 
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
 <!-- Customize your theme here. --> 
 <item name="colorPrimary">@color/colorPrimary</item>
 <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
<item name="colorAccent">@color/colorAccent</item>
<item name="Android:windowAnimationStyle">@style/activityAnim</item>
 </style><!-- 使用style方式定義activity切換動畫 -->
<style name="activityAnim">
<item name="Android:activityOpenEnterAnimation">@anim/slide_in_top</item>
<item name="Android:activityOpenExitAnimation">@anim/slide_in_top</item> </style>

而在windowAnimationStyle中存在四種動畫:

activityOpenEnterAnimation  用于設(shè)置打開新的Activity并進入新的Activity展示的動畫
activityOpenExitAnimation  用于設(shè)置打開新的Activity并銷毀之前的Activity展示的動畫
activityCloseEnterAnimation   用于設(shè)置關(guān)閉當(dāng)前Activity進入上一個Activity展示的動畫
activityCloseExitAnimation   用于設(shè)置關(guān)閉當(dāng)前Activity時展示的動畫

3.使用ActivityOptions切換動畫實現(xiàn)Activity跳轉(zhuǎn)動畫
通過overridePendingTransition方法基本上可以滿足我們?nèi)粘V袑ctivity跳轉(zhuǎn)動畫的需求了,但MD風(fēng)格出來之后,overridePendingTransition這種老舊、生硬的方式怎么能適合我們的MD風(fēng)格的App呢?google在新的sdk中給我們提供了另外一種Activity的過度動畫——ActivityOptions。并且提供了兼容包——ActivityOptionsCompat。ActivityOptionsCompat是一個靜態(tài)類,提供了相應(yīng)的Activity跳轉(zhuǎn)動畫效果,通過其可以實現(xiàn)不少炫酷的動畫效果。
(1)在跳轉(zhuǎn)的Activity中設(shè)置contentFeature

  @Override protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 // 設(shè)置contentFeature,可使用切換動畫 
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); 
Transition explode = TransitionInflater.from(this).inflateTransition(Android.R.transition.explode);
getWindow().setEnterTransition(explode); 
setContentView(R.layout.activity_three); 
}

(2)在startActivity執(zhí)行跳轉(zhuǎn)邏輯的時候調(diào)用startActivity的重寫方法,執(zhí)行ActivityOptions.makeSceneTransitionAnimation方法

/** * 點擊按鈕,實現(xiàn)Activity的跳轉(zhuǎn)操作 * 通過Android5.0及以上代碼的方式實現(xiàn)activity的跳轉(zhuǎn)動畫 */
 button3.setOnClickListener(new View.OnClickListener() { 
 @Override public void onClick(View v) { 
 Intent intent = new Intent(MainActivity.this, ThreeActivity.class); 
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle()); 
}
});

activity跳轉(zhuǎn)動畫效果

(四)使用ActivityOptions之后內(nèi)置的動畫效果通過style的方式
這種方式其實就是通過style的方式展示和使用ActivityOptions過度動畫,下面是實現(xiàn)通過定義style方式定義過度動畫的步驟:
(1)編寫過度動畫文件

  <explode xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:duration="300" />

首先我們需要在Application項目res目錄下新建一個transition目錄,然后創(chuàng)建資源文件,然后使用這些系統(tǒng)自帶的過渡動畫效果,這里設(shè)置了過度時長為300ms。
(2)定義style文件

<!-- Base application theme. --> 
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
<!-- Customize your theme here. --> 
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
<item name="colorAccent">@color/colorAccent</item>
<item name="Android:windowEnterTransition">@transition/activity_explode</item>
<item name="Android:windowExitTransition">@transition/activity_explode</item> 
</style>

在Application的style文件中添加:

<item name="Android:windowEnterTransition">@transition/activity_explode</item>
<item name="Android:windowExitTransition">@transition/activity_explode</item>

并指定過渡動畫效果為我們剛剛定義的過渡動畫文件。
(3)執(zhí)行跳轉(zhuǎn)邏輯點擊按鈕,實現(xiàn)Activity的跳轉(zhuǎn)操作 * 通過Android5.0及以上style的方式實現(xiàn)activity的跳轉(zhuǎn)動畫

button4.setOnClickListener(new View.OnClickListener() 
{ @Override public void onClick(View v) {
 /** * 調(diào)用ActivityOptions.makeSceneTransitionAnimation實現(xiàn)過度動畫 */ 
 Intent intent = new Intent(MainActivity.this, FourActivity.class); 
 startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle()); 
 }
 });

這樣執(zhí)行之后也可以展示出Activity跳轉(zhuǎn)過度動畫了,其和通過代碼方式實現(xiàn)的效果是類似的,而且這種動畫效果是全局的。

(五)使用ActivityOptions動畫共享組件的方式實現(xiàn)跳轉(zhuǎn)Activity動畫
這里的共享組件動畫效果是指將前面一個Activity的某個子View與后面一個Activity的某個子View之間有過渡效果,即在這種過度效果下實現(xiàn)Activity的跳轉(zhuǎn)操作。那么如何實現(xiàn)兩個組件View之間實現(xiàn)過渡效果呢?
(1)定義共享組件在Activity a中的button按鈕點擊transitionName屬性:

<Button Android:id="@+id/button5" 
Android:layout_width="match_parent" 
Android:layout_height="wrap_content" 
Android:layout_below="@+id/button4" 
Android:layout_marginTop="10dp" 
Android:layout_marginRight="10dp" 
Android:layout_marginLeft="10dp" Android:text="組件過度動畫" 
Android:background="@color/colorPrimary" 
Android:transitionName="shareNames" />

在Activity b的布局文件中為組件定義transitionName屬性,這樣這兩個組件相當(dāng)于有了過度對應(yīng)關(guān)系,這里需要注意的是這兩個組件的transitionName屬性的值必須是相同的。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
xmlns:Android="http://schemas.Android.com/apk/res/Android" 
Android:id="@+id/activity_second" 
Android:layout_width="match_parent" 
Android:layout_height="match_parent" 
Android:gravity="center_horizontal" Android:orientation="vertical" 
Android:transitionName="shareNames" > <TextView 
Android:layout_width="match_parent" 
Android:layout_height="match_parent" 
Android:background="@color/colorAccent" 
Android:layout_marginTop="10dp" 
Android:layout_marginBottom="10dp" />
</LinearLayout>

(2)調(diào)用startActivity執(zhí)行跳轉(zhuǎn)動畫點擊按鈕,實現(xiàn)Activity的跳轉(zhuǎn)操作 * 通過Android5.0及以上共享組件的方式實現(xiàn)activity的跳轉(zhuǎn)動畫

 button5.setOnClickListener(new View.OnClickListener() { 
 @Override public void onClick(View v) { 
 Intent intent = new Intent(MainActivity.this, FiveActivity.class); 
 startActivity(intent, 
 ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, button5, "shareNames").toBundle()); } 
 }
);

需要說明的是這里調(diào)用的ActivityOptions.makeSceneTransitionAnimation方法,傳遞了三個參數(shù),其中第一個參數(shù)為context對象,第二個參數(shù)為啟動Activity的共享組件,第三個參數(shù)為啟動Activity的共享組件transitionName屬性值。這樣經(jīng)過調(diào)用之后我們就實現(xiàn)了從Activity a跳轉(zhuǎn)到Activity b的時候a中的組件到b中組件的過度效果。


這里寫圖片描述

過渡動畫總結(jié)
overridePendingTransition方法從Android2.0開始,基本上能夠覆蓋我們activity跳轉(zhuǎn)動畫的需求;
ActivityOptions API是在Android5.0開始的,可以實現(xiàn)一些炫酷的動畫效果,更加符合MD風(fēng)格;
ActivityOptions還可以實現(xiàn)兩個Activity組件之間的過度動畫;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,366評論 25 708
  • 和萊特交往的第三天,我還沒來得及掉入甜蜜里,就被今天的一場聚會狠狠地打了一耳光——白矮星社的聯(lián)誼。 我并不知道,原...
    三里同學(xué)閱讀 307評論 0 1
  • 這篇文章的主旨是傳遞一種生活的智慧,或者說生存策略,就是要學(xué)會“把失敗歸因于自己,把成功歸因于自身以外的因素(良好...
    卓海閱讀 446評論 0 4

友情鏈接更多精彩內(nèi)容