文章目錄
-
- 使用場景
- 原生自帶
- 自定義
- 動畫坐标定義
- 動畫內插補點器
- 方案選擇
- 撸代碼
-
- 定義具體動畫檔案
- 方案一
- 方案二
- 優缺點
- 轉場動畫實效問題集錄
相關文章推薦
android共享元素動畫相容低版本
使用場景
從一個Activity A跳轉到另外一個Activity B,B頁面關閉回到A。這裡動畫涉及兩個activity,有以下過程:
1.A打開B時A的離場動畫和B的入場動畫。
2.B關閉回到A時B的離場動畫和A的入場動畫。
原生自帶
Android已經内置了幾種動畫效果,可以見 android.R.anim 類。一般情況下我們需要自己定義螢幕切換的效果。
自定義
主要有以下四個屬性:
當我們從 A 啟動 B 時,A 從螢幕上消失,這個動畫叫做 android:activityOpenExitAnimation
當我們從 A 啟動 B 時,B 出現在螢幕上,這個動畫叫做 android:activityOpenEnterAnimation
當我們從 B 退出回到 A 時,B 從螢幕上消失,這個叫做 android:activityCloseExitAnimation
當我們從 B 退出回到 A 時,A 出現在螢幕上,這個叫做 android:activityCloseEnterAnimation
動畫坐标定義
動畫操作中操作的都是原點位置。
fromYDelta="100%"為底部
fromYDelta="0%"為頂部
fromXDelta="0%"為左側
fromXDelta="100%“為右側
fromXDelta=”-100%“為左側超出一個螢幕寬度
fromYDelta=”-100%"為頂部超出一個螢幕高度
動畫內插補點器
動畫內插補點器屬性:
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
設定動畫為先加速在減速(開始速度最快 逐漸減慢)
android動畫內插補點器詳解
方案選擇
有兩種方案可以實作
1.靜态方式設定:将切換動畫寫到style中,再在theme中指定此style,在AndroidManifest中A和B的activity聲明中設定此theme。
2.動态方式設定:在A的startActivity()方法後調用:
overridePendingTransition(R.anim.activity_b_translate_in_down_to_up,R.anim.activity_a_translate_out_down_to_up);
來設定B的進入動畫和A的消失動畫。
在B的finish()方法後調用:
overridePendingTransition(R.anim.activity_a_translate_in_up_to_down,R.anim.activity_b_translate_out_up_to_down);
來設定A的進場動畫和B的消失動畫。注意:要在super.finish()後設定。
撸代碼
定義具體動畫檔案
這裡的動畫可以是透明度、位移、縮放之類的任何動畫,我這裡以位移來舉例。
當我們 A 啟動 B 時,我希望
A 從下至上平移退出螢幕(activity_a_translate_out_down_to_up),
B 從下至上平移進入螢幕(activity_b_translate_in_down_to_up)。
當我們從 B 退出回到 A 時,我希望
B 從上至下平移退出螢幕(activity_b_translate_out_up_to_down),
A 從上至下平移進入螢幕(activity_a_translate_in_up_to_down)。
1、activity_b_translate_in_down_to_up.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:fromYDelta="100%"//以左上角頂點作為原點移動,Y100%即為頂部,X100%即為右側,0%為底部
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:toYDelta="0%">
</translate>
2、activity_b_translate_out_up_to_down.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:fromYDelta="0%"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:toYDelta="100%">
</translate>
3、activity_a_translate_in_up_to_down.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:fromYDelta="-100%"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:toYDelta="0%">
</translate>
4、activity_a_translate_out_down_to_up.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:fromYDelta="0%"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:toYDelta="-100%">
</translate>
方案一
一、定義切換動畫 style
res/values/styles.xml
<style name="AnimFadeBottomToUp" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/activity_b_translate_in_down_to_up</item>
<item name="android:activityCloseExitAnimation">@anim/activity_b_translate_out_up_to_down</item>
<item name="android:activityOpenExitAnimation">@anim/activity_a_translate_out_down_to_up</item>
<item name="android:activityCloseEnterAnimation">@anim/activity_a_translate_in_up_to_down</item>
</style>
二、定義包含動畫的 Activity 主題
res/values/styles.xml
很簡單,就是使用 windowAnimationStyle 這個屬性,指定切換動畫的style即可。
<style name="vertical_slide" parent="android:Theme.NoTitleBar">
<item name="android:windowAnimationStyle">@style/AnimFadeBottomToUp</item>
</style>
三、注冊該Activity到Manifest中,加上them屬性就行了
<activity
android:name=".ActivityA"
android:theme="@style/vertical_slide">
</activity>
<activity
android:name=".ActivityB"
android:theme="@style/vertical_slide">
</activity>
四、調用啟動Activity
A:
Intent intent = new Intent(this, AnimationActivity.class);
startActivity(intent);
B:
finish();
方案二
A:
Intent intent = new Intent(v.getContext(), AnimationActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.activity_b_translate_in_down_to_up,R.anim.activity_a_translate_out_down_to_up);
B:
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.activity_a_translate_in_up_to_down,R.anim.activity_b_translate_out_up_to_down);
}
優缺點
方案一
優點:不需要考慮activity多個入口情況;
缺點:系統相容性不好,5.0以下實效
方案二
優點:無相容性問題;
缺點:多個入口的情況下每個入口都需要設定。
轉場動畫實效問題集錄
1.在出現activity出現黑屏的時候 我們會這樣設定
可以解決黑屏問題,同時引出另一個問題 :activity轉場動畫失效了
檢查下清單檔案内的動畫資源是不是引用的不對 是不是寫出了這樣
如果是這樣的話 改成這樣就可以啦