Android動畫一:Activity過渡動畫詳細實現原理

雖然 Android 5.0 以後推出了新的過渡動畫方式,但一般只是用於特定的場合使用,activity.overridePendingTransition() 通用方式的過渡動畫仍是很經常使用。 java

原理分析

startActivity(Intent(this,SecondActivity::class.java))
overridePendingTransition(enterAnim, exitAnim)
複製代碼

overridePendingTransition有兩個參數,第一個參數(enterAnim)是做用於SecondActivity 的進入屏幕可見區域效果,第二個參數(exitAnim)是做用於當前 Activity 離開屏幕可見區域效果。android

示意圖

RightIn:從右邊滑入屏幕(iOS默認效果)

iOS 默認的效果,新的Activity從右邊(R)進入顯示區域,當前Activity從左邊離開顯示區域到(L)。git

enterAnim(activity_right_to_left_enter.xml):X軸從 100% 到 0github

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="300"
        android:fromXDelta="100%"
        android:toXDelta="0" />
</set>
複製代碼

exitAnim(activity_right_to_left_exit.xml):X軸從 0 到 -100%bash

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="300"
        android:fromXDelta="0"
        android:toXDelta="-100%" />
</set>
複製代碼

使用ide

startActivity(Intent(this,SecondActivity::class.java))
overridePendingTransition(R.anim.activity_right_to_left_enter, R.anim.activity_right_to_left_exit)
複製代碼
BottomIn:從底部彈出Activity(經常使用效果)

通常從底部彈出新Activity,就是從B區域到屏幕可見區域,當前的Activity是保持不變的。 enterAnim(activity_bottom_to_top_enter.xml):Y軸從 100% 到 0動畫

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="300"
        android:fromYDelta="100%"
        android:toYDelta="0" />
</set>
複製代碼

exitAnim(no_anim.xml):Y軸保持不變ui

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="300"
        android:fromYDelta="0"
        android:toYDelta="0"/>
</set>
複製代碼

使用this

startActivity(Intent(this,SecondActivity::class.java))
overridePendingTransition(R.anim.activity_bottom_to_top_enter, R.anim.no_anim)
複製代碼

RightOut(和RightIn對應,iOS 默認效果)

前面講了startActivity的轉場動畫,下面講finish()的轉場動畫。overridePendingTransition有兩個參數,第一個參數(enterAnim)是做用於上一個Activity的進入屏幕可見區域效果,第二個參數(exitAnim)是做用於當前 Activity 離開屏幕可見區域效果。spa

iOS默認的finish動畫,是當前的Activity從屏幕可見區域到R區域,上一個Activity從L區域到屏幕可見區域。

enterAnim(activity_left_to_right_enter.xml):X軸從 -100% 到 0

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="300"
        android:fromXDelta="-100%"
        android:toXDelta="0" />
</set>
複製代碼

exitAnim(activity_left_to_right_exit.xml):X軸從 0 到 100%

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="300"
        android:fromXDelta="0"
        android:toXDelta="100%" />
</set>
複製代碼

使用

finish()
overridePendingTransition(R.anim.activity_left_to_right_enter, R.anim.activity_left_to_right_exit)
複製代碼
BottomOut(和BottomIn對應,經常使用效果)

從屏幕底部滑出效果是,當前Activity從底部滑出屏幕可見區域,上一個Activity保持不變,和BottomIn不一樣的是,enterAnim是不須要使用動畫,由於上一個Activity已經在屏幕的後面了,只須要改變當前Activity消失的效果。 exitAnim(activity_top_to_bottom_exit.xml):Y軸從 0 到 100%

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="300"
        android:fromYDelta="0%"
        android:toYDelta="100%" />
</set>
複製代碼

使用

finish()
overridePendingTransition(0, R.anim.activity_top_to_bottom_exit)
複製代碼

完整示例代碼

github.com/taoweiji/Ac…

相關文章
相關標籤/搜索