Android動畫-View動畫的使用場景

目錄

  1. PopupWindow的動畫
    1.1. 原效果
    1.2. 加動畫
  2. Activity過場動畫
    2.1. 通過overridePendingTransition
    2.2. 也是通過style
  3. 給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)在加上一個動畫乏悄,首先要定義動畫。

  1. 進入的動畫:
<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>
  1. 消失的動畫:
<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>
  1. 做成一個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>
  1. 設(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);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胸完,一起剝皮案震驚了整個濱河市书释,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赊窥,老刑警劉巖爆惧,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異誓琼,居然都是意外死亡检激,警方通過查閱死者的電腦和手機肴捉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門腹侣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人齿穗,你說我怎么就攤上這事傲隶。” “怎么了窃页?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵跺株,是天一觀的道長复濒。 經(jīng)常有香客問我,道長乒省,這世上最難降的妖魔是什么巧颈? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮袖扛,結(jié)果婚禮上砸泛,老公的妹妹穿的比我還像新娘。我一直安慰自己蛆封,他們只是感情好唇礁,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惨篱,像睡著了一般盏筐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上砸讳,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天琢融,我揣著相機與錄音,去河邊找鬼簿寂。 笑死吏奸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的陶耍。 我是一名探鬼主播奋蔚,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼烈钞!你這毒婦竟也來了泊碑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤毯欣,失蹤者是張志新(化名)和其女友劉穎馒过,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酗钞,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡腹忽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了砚作。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窘奏。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖葫录,靈堂內(nèi)的尸體忽然破棺而出着裹,到底是詐尸還是另有隱情,我是刑警寧澤米同,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布骇扇,位于F島的核電站摔竿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏少孝。R本人自食惡果不足惜继低,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望稍走。 院中可真熱鬧郁季,春花似錦、人聲如沸钱磅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盖淡。三九已至年柠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間褪迟,已是汗流浹背冗恨。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留味赃,地道東北人掀抹。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像心俗,于是被迫代替她去往敵國和親傲武。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容