目錄
- PopupWindow的動畫
1.1. 原效果
1.2. 加動畫 - Activity過場動畫
2.1. 通過overridePendingTransition
2.2. 也是通過style - 給ViewGroup的子控件加進場動畫
3.1. 通過XML
3.2. 通過java
View動畫的一個特點就是到旦,他的動畫僅僅是動的View的繪制地方,View真正的位置并沒有一起動畫破托。
View除了會用作直接作用頁面中的View外吮炕,通常還用用在下面一些地方
博客地址
PopupWindow的動畫
原效果
先做一個PopupWindow,這個PopupWindow的View只有一個背景圖片,一只大貓醉锄。:
private void initWindow() {
View view = new View(this);
view.setBackground(getDrawable(R.drawable.xiaomao));
popupWindow = new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
}
然后給按鈕的點擊事件設(shè)置為顯示PopupWindow:
btnRun.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (popupWindow.isShowing()) {
popupWindow.dismiss();
} else {
popupWindow.showAsDropDown(btnRun);
}
}
});
這時的效果是這樣的:
加動畫
那么現(xiàn)在加上一個動畫乏悄,首先要定義動畫。
- 進入的動畫:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="100%"
android:toYDelta="0"
android:duration="2000" />
<alpha
android:fromAlpha="0"
android:toAlpha="1"
android:duration="2000"
/>
</set>
- 消失的動畫:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="0"
android:toYDelta="100%"
android:duration="2000" />
<alpha
android:fromAlpha="1"
android:toAlpha="0"
android:duration="2000"
/>
</set>
- 做成一個style,在res/values/styles.xml文件里加上:
<style name="pop_anim">
<item name="android:windowEnterAnimation">@anim/pop_in</item>
<item name="android:windowExitAnimation">@anim/pop_out</item>
</style>
- 設(shè)置動畫
這一步就很簡單恳不,就加一行代碼
private void initWindow() {
View view = new View(this);
view.setBackground(getDrawable(R.drawable.xiaomao));
popupWindow = new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.setAnimationStyle(R.style.pop_anim);
}
這時效果就成下面那樣了:
Activity過場動畫
通過overridePendingTransition
這種方法寫著簡單但是不好用檩小,通過overridePendingTransition,他的兩個參數(shù)分別是新Activity進入時的動畫和舊Activity退出時的動畫.如果設(shè)置為0則沒有動畫烟勋。
這個方法必須跟在startActivity()或finish()后面才會生效规求。
還是先定義兩個動畫:
進入時的動畫:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="100%"
android:toYDelta="0"
android:duration="2000" />
<alpha
android:fromAlpha="0"
android:toAlpha="1"
android:duration="2000"
/>
</set>
退出時的動畫:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="0"
android:toYDelta="-100%"
android:duration="2000" />
<alpha
android:fromAlpha="1"
android:toAlpha="0"
android:duration="2000"
/>
</set>
跳轉(zhuǎn)時調(diào)用:
startActivity(new Intent(MainActivity.this,SecondActivity.class));
overridePendingTransition(R.anim.activity_in,R.anim.activity_out);
效果:
也是通過style
首先看res/values/styles.xml。定義了一個叫ActivityAnim的style卵惦,里面有四個屬性阻肿,分表代表下面的含義
屬性 | 含義 |
---|---|
activityOpenEnterAnimation | 打開一個新的Activity時,要顯示的新的Activit執(zhí)行的動畫 |
activityOpenExitAnimation | 打開一個新的Activity時沮尿,當(dāng)前的舊的Activit執(zhí)行的動畫 |
activityCloseEnterAnimation | 關(guān)閉一個activity時丛塌,要顯示的上一個Activity執(zhí)行的動畫 |
activityCloseExitAnimation | 關(guān)閉一個activity時,被關(guān)閉的Activity執(zhí)行的動畫 |
這四個動畫可以針對需要只設(shè)置需要的畜疾。
把ActivityAnim
設(shè)置給APP要用的主題AppTheme的android:windowAnimationStyle
屬性
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<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 name="ActivityAnim">
<item name="android:activityOpenEnterAnimation">@anim/activity_in</item>
<item name="android:activityOpenExitAnimation">@anim/activity_out</item>
<item name="android:activityCloseEnterAnimation">@anim/activity_close_in</item>
<item name="android:activityCloseExitAnimation">@anim/activity_close_out</item>
</style>
</resources>
在后再清單文件里引用這個主題:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sunlinlin.animademo">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity"></activity>
</application>
</manifest>
上面的四個動畫分別是:
activity_in:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="100%"
android:toYDelta="0"
android:duration="2000" />
<alpha
android:fromAlpha="0"
android:toAlpha="1"
android:duration="2000" />
</set>
activity_out:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="0"
android:toYDelta="-100%"
android:duration="2000" />
<alpha
android:fromAlpha="1"
android:toAlpha="0"
android:duration="2000" />
</set>
activity_close_in:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="-100%"
android:toYDelta="0"
android:duration="2000" />
<alpha
android:fromAlpha="0"
android:toAlpha="1"
android:duration="2000" />
</set>
activity_close_out:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="0"
android:toYDelta="100%"
android:duration="2000" />
<alpha
android:fromAlpha="1"
android:toAlpha="0"
android:duration="2000" />
</set>
最終的效果是:
給ViewGroup的子控件加進場動畫
LayoutAnimation是作用于ViewGroup的赴邻,用來指定ViewGroup的子控件出現(xiàn)的動畫
先做一個子控件出現(xiàn)的動畫,從之前隨便選個activity_in.xml
:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="100%"
android:toYDelta="0"
android:duration="2000" />
<alpha
android:fromAlpha="0"
android:toAlpha="1"
android:duration="2000" />
</set>
準(zhǔn)備好了動畫,接下來有兩種方法啡捶,也是xml和java
通過XML
然后新建一個動畫文件,這里叫anim_layout.xml
,這里有三個屬性:
屬性 | 作用 |
---|---|
android:delay | 可以取值為數(shù)值姥敛,百分?jǐn)?shù),或百分?jǐn)?shù)p瞎暑。表示兩個子控件執(zhí)行出場動畫的間隔時間彤敛,為0時忿偷,所有控件的動畫沒有延遲全部開始執(zhí)行;為1時表示等上一個控件動畫執(zhí)行完畢才開始執(zhí)行下一個臊泌;為0.5時表示等上一個控件動畫執(zhí)行一半開始執(zhí)行下一個鲤桥。可以大于1渠概。茶凳。。當(dāng)這個值為百分?jǐn)?shù)時播揪,如50%贮喧,表示這個延遲時間是當(dāng)前動畫執(zhí)行時間的50%。猪狈。箱沦。當(dāng)這個值是百分?jǐn)?shù)p的時候,如50%p,表示這個延遲時間是父View的動畫時間的50%雇庙。 |
android:animationOrder | 有三個值::normal表示按正常順序出現(xiàn)谓形。random表示亂序出現(xiàn)。reverse表示反序出現(xiàn)疆前。 |
android:animation | 指定出現(xiàn)時要執(zhí)行的動畫 |
anim_layout.xml
文件代碼,設(shè)置上一個動畫執(zhí)行五分之一時開始下一個動畫寒跳,倒序執(zhí)行:
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="0.2"
android:animationOrder="reverse"
android:animation="@anim/activity_in">
</layoutAnimation>
然后在Activity的布局文件中,將一個LinearLayout通過android:layoutAnimation
加上了這個動畫:
<LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/btn_back"
android:layoutAnimation="@anim/anim_layout"
android:orientation="vertical">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="哈哈" />
...
</LinearLayout>
然后進入這個Activity時就會看到這個效果:
通過java
這里不需要建新的文件了竹椒。覺得比上面的方便許多童太,效果跟上圖是一樣的。
ll = (LinearLayout) findViewById(R.id.ll);
Animation animation = AnimationUtils.loadAnimation(this,R.anim.activity_in);
LayoutAnimationController controller = new LayoutAnimationController(animation);
controller.setDelay(0.2f);
controller.setOrder(LayoutAnimationController.ORDER_REVERSE);
ll.setLayoutAnimation(controller);