1.使用overridePendingTransition方法實(shí)現(xiàn)Activity跳轉(zhuǎn)動(dòng)畫(huà)
overridePendingTransition方法是Activity中提供的Activity跳轉(zhuǎn)動(dòng)畫(huà)方法,通過(guò)該方法可以實(shí)現(xiàn)Activity跳轉(zhuǎn)時(shí)的動(dòng)畫(huà)效果,簡(jiǎ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的切換動(dòng)畫(huà)
(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切換動(dòng)畫(huà)的style。而@anim/slide_in_top就是我們定義的動(dòng)畫(huà)文件,也就是說(shuō)通過(guò)為Appliation設(shè)置style,然后為windowAnimationStyle設(shè)置動(dòng)畫(huà)文件就可以全局的為Activity的跳轉(zhuǎn)配置動(dòng)畫(huà)效果。
<!-- 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切換動(dòng)畫(huà) -->
<style name="activityAnim">
<item name="Android:activityOpenEnterAnimation">@anim/slide_in_top</item>
<item name="Android:activityOpenExitAnimation">@anim/slide_in_top</item> </style>
而在windowAnimationStyle中存在四種動(dòng)畫(huà):
activityOpenEnterAnimation 用于設(shè)置打開(kāi)新的Activity并進(jìn)入新的Activity展示的動(dòng)畫(huà)
activityOpenExitAnimation 用于設(shè)置打開(kāi)新的Activity并銷(xiāo)毀之前的Activity展示的動(dòng)畫(huà)
activityCloseEnterAnimation 用于設(shè)置關(guān)閉當(dāng)前Activity進(jìn)入上一個(gè)Activity展示的動(dòng)畫(huà)
activityCloseExitAnimation 用于設(shè)置關(guān)閉當(dāng)前Activity時(shí)展示的動(dòng)畫(huà)
3.使用ActivityOptions切換動(dòng)畫(huà)實(shí)現(xiàn)Activity跳轉(zhuǎn)動(dòng)畫(huà)
通過(guò)overridePendingTransition方法基本上可以滿足我們?nèi)粘V袑?duì)Activity跳轉(zhuǎn)動(dòng)畫(huà)的需求了,但MD風(fēng)格出來(lái)之后,overridePendingTransition這種老舊、生硬的方式怎么能適合我們的MD風(fēng)格的App呢?google在新的sdk中給我們提供了另外一種Activity的過(guò)度動(dòng)畫(huà)——ActivityOptions。并且提供了兼容包——ActivityOptionsCompat。ActivityOptionsCompat是一個(gè)靜態(tài)類(lèi),提供了相應(yīng)的Activity跳轉(zhuǎn)動(dòng)畫(huà)效果,通過(guò)其可以實(shí)現(xiàn)不少炫酷的動(dòng)畫(huà)效果。
(1)在跳轉(zhuǎn)的Activity中設(shè)置contentFeature
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 設(shè)置contentFeature,可使用切換動(dòng)畫(huà)
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)邏輯的時(shí)候調(diào)用startActivity的重寫(xiě)方法,執(zhí)行ActivityOptions.makeSceneTransitionAnimation方法
/** * 點(diǎn)擊按鈕,實(shí)現(xiàn)Activity的跳轉(zhuǎn)操作 * 通過(guò)Android5.0及以上代碼的方式實(shí)現(xiàn)activity的跳轉(zhuǎn)動(dòng)畫(huà) */
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)動(dòng)畫(huà)效果
(四)使用ActivityOptions之后內(nèi)置的動(dòng)畫(huà)效果通過(guò)style的方式
這種方式其實(shí)就是通過(guò)style的方式展示和使用ActivityOptions過(guò)度動(dòng)畫(huà),下面是實(shí)現(xiàn)通過(guò)定義style方式定義過(guò)度動(dòng)畫(huà)的步驟:
(1)編寫(xiě)過(guò)度動(dòng)畫(huà)文件
<explode xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:duration="300" />
首先我們需要在Application項(xiàng)目res目錄下新建一個(gè)transition目錄,然后創(chuàng)建資源文件,然后使用這些系統(tǒng)自帶的過(guò)渡動(dòng)畫(huà)效果,這里設(shè)置了過(guò)度時(shí)長(zhǎng)為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>
并指定過(guò)渡動(dòng)畫(huà)效果為我們剛剛定義的過(guò)渡動(dòng)畫(huà)文件。
(3)執(zhí)行跳轉(zhuǎn)邏輯點(diǎn)擊按鈕,實(shí)現(xiàn)Activity的跳轉(zhuǎn)操作 * 通過(guò)Android5.0及以上style的方式實(shí)現(xiàn)activity的跳轉(zhuǎn)動(dòng)畫(huà)
button4.setOnClickListener(new View.OnClickListener()
{ @Override public void onClick(View v) {
/** * 調(diào)用ActivityOptions.makeSceneTransitionAnimation實(shí)現(xiàn)過(guò)度動(dòng)畫(huà) */
Intent intent = new Intent(MainActivity.this, FourActivity.class);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle());
}
});
這樣執(zhí)行之后也可以展示出Activity跳轉(zhuǎn)過(guò)度動(dòng)畫(huà)了,其和通過(guò)代碼方式實(shí)現(xiàn)的效果是類(lèi)似的,而且這種動(dòng)畫(huà)效果是全局的。
(五)使用ActivityOptions動(dòng)畫(huà)共享組件的方式實(shí)現(xiàn)跳轉(zhuǎn)Activity動(dòng)畫(huà)
這里的共享組件動(dòng)畫(huà)效果是指將前面一個(gè)Activity的某個(gè)子View與后面一個(gè)Activity的某個(gè)子View之間有過(guò)渡效果,即在這種過(guò)度效果下實(shí)現(xiàn)Activity的跳轉(zhuǎn)操作。那么如何實(shí)現(xiàn)兩個(gè)組件View之間實(shí)現(xiàn)過(guò)渡效果呢?
(1)定義共享組件在Activity a中的button按鈕點(diǎn)擊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="組件過(guò)度動(dòng)畫(huà)"
Android:background="@color/colorPrimary"
Android:transitionName="shareNames" />
在Activity b的布局文件中為組件定義transitionName屬性,這樣這兩個(gè)組件相當(dāng)于有了過(guò)度對(duì)應(yīng)關(guān)系,這里需要注意的是這兩個(gè)組件的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)動(dòng)畫(huà)點(diǎn)擊按鈕,實(shí)現(xiàn)Activity的跳轉(zhuǎn)操作 * 通過(guò)Android5.0及以上共享組件的方式實(shí)現(xiàn)activity的跳轉(zhuǎn)動(dòng)畫(huà)
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()); }
}
);
需要說(shuō)明的是這里調(diào)用的ActivityOptions.makeSceneTransitionAnimation方法,傳遞了三個(gè)參數(shù),其中第一個(gè)參數(shù)為context對(duì)象,第二個(gè)參數(shù)為啟動(dòng)Activity的共享組件,第三個(gè)參數(shù)為啟動(dòng)Activity的共享組件transitionName屬性值。這樣經(jīng)過(guò)調(diào)用之后我們就實(shí)現(xiàn)了從Activity a跳轉(zhuǎn)到Activity b的時(shí)候a中的組件到b中組件的過(guò)度效果。
這里寫(xiě)圖片描述
過(guò)渡動(dòng)畫(huà)總結(jié)
overridePendingTransition方法從Android2.0開(kāi)始,基本上能夠覆蓋我們activity跳轉(zhuǎn)動(dòng)畫(huà)的需求;
ActivityOptions API是在Android5.0開(kāi)始的,可以實(shí)現(xiàn)一些炫酷的動(dòng)畫(huà)效果,更加符合MD風(fēng)格;
ActivityOptions還可以實(shí)現(xiàn)兩個(gè)Activity組件之間的過(guò)度動(dòng)畫(huà);