天天看點

Activity轉場動畫設定

Activity轉場動畫設定

文章目錄

    • 使用場景
    • 原生自帶
    • 自定義
    • 動畫坐标定義
    • 動畫內插補點器
    • 方案選擇
    • 撸代碼
      • 定義具體動畫檔案
      • 方案一
      • 方案二
    • 優缺點
    • 轉場動畫實效問題集錄

相關文章推薦

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

動畫坐标定義

Activity轉場動畫設定

動畫操作中操作的都是原點位置。

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轉場動畫設定

可以解決黑屏問題,同時引出另一個問題 :activity轉場動畫失效了

檢查下清單檔案内的動畫資源是不是引用的不對 是不是寫出了這樣

Activity轉場動畫設定

如果是這樣的話 改成這樣就可以啦

Activity轉場動畫設定
Activity轉場動畫設定