Sample code : Android Activity transition
Sample code : Android Activity transition
由一個 Activity 切換到另一個 Activity, 使用 startActivity(Intent) 來進行
1. 基本的語法
val intent = Intent(this, SecondActivity::class.java).apply {
putExtra(AlarmClock.EXTRA_MESSAGE, "Hello, second.") // pass value to the activity
}
startActivity(intent)
這裡可以透過 putExtra 來傳遞資料到另一個 Activity
而另一個 Activity 則可以在 onCreate 裡這麼收:
val msg = intent.getStringExtra(AlarmClock.EXTRA_MESSAGE) ?: "No message"
後面的 ?: 是指如果沒收到資料時的預設值,是 kotlin 的語法。雖然依 kotlin 語法來說不需要這個,因為 msg 沒加?所以 getStringExtra 必需要給一個非 null 值,不過我對 Android 裡把 Java 跟 Kotlin 混用的情形下,並不是很信任… 還是加一下 ?: 比較安心。
2. 過場動畫
如果切換時要有滑入的動畫,可以這麼作:
startActivity(
Intent(
this,
SecondActivity::class.java
)
)
overridePendingTransition(
// 指定轉換的動畫
R.anim.slide_in_right, // 新 Activity 進入動畫
R.anim.slide_out_left // 原 Activity 離開的動畫
)
這裡的 overridePendingTransition 是個奇妙的函式:
public void overridePendingTransition (int enterAnim,
int exitAnim)
他會判斷此時是那個 activity 要離開,那個 activity 要進來,而將 enterAnimation 跟 exitAnimation 分配下去,而且它必需在 startActivity() startActivityForResult() 以及 finish() 等使用,而且必需要在之後立刻呼叫
而其中的 R.anim.slide_in_right 是資源檔,內容為:
而回來的時候也可以這麼作:
finish()
overridePendingTransition(
// 指定轉換的動畫
R.anim.slide_in_left, // 新 Activity 進入動畫
R.anim.slide_out_right // 原 Activity 離開的動畫
)
3. 切換為新的 Root Activity
要切換為新的 Root Activity,並且清除全部在背景的 Activity 時,可以這麼作:
val intent = Intent(this, SecondActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
startActivity(intent)
finish()
overridePendingTransition(
// 指定轉換的動畫
R.anim.slide_in_right, // 新 Activity 進入動畫
R.anim.slide_out_left // 原 Activity 離開的動畫
)
但是這時如果還要回來的時候,就不能只呼叫 finish(),因為只剩最後一個 Activity 這樣會導致 APP 關閉,所以得要這麼作:
val intent = Intent(this, MainActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
startActivity(intent)
finish()
overridePendingTransition(
// 指定轉換的動畫
R.anim.slide_in_left, // 新 Activity 進入動畫
R.anim.slide_out_right // 原 Activity 離開的動畫
)
Sample project :