Android View Animation

概述

可譯為視圖動畫魁莉,分為

  • 縮放動畫
  • 平移動畫
  • 漸變動畫
  • 旋轉(zhuǎn)動畫

Android系統(tǒng)中定義了一個抽象類Animation來定義這種視圖動畫旷档,它的具體子類如下表:

動畫名稱 對應(yīng)的子類 xml中標(biāo)簽 描述
縮放動畫 ScaleAnimation < scale /> S
平移動畫 TranslateAnimaiton < translate /> T
漸變動畫 AlphaAnimation < alpha /> A
旋轉(zhuǎn)動畫 RoateAnimation < roate /> R
動畫集合 AnimationSet < set /> 是用來存放上面四種動畫的集合虹统,容器的概念而已

這類動畫也被稱作是補(bǔ)間動畫(Tween Animation),取他們首字母這樣樣記憶呢 STAR 動畫如何看蚜?(哈哈別鬧氮墨,我自稱)糯累, “明星” 動畫是Android提供最早的動畫框架,只能這幾種效果或者他們的組合效果(明星獨(dú)唱或者組合嘍)在辆,使用起來也是非常方便簡單证薇,可以代碼實(shí)現(xiàn)也可以在XML中定義使用。

那么這些視圖動畫有哪些通用屬性匆篓,這里列舉了父類Animaiton常用屬性:

xml中屬性 對應(yīng)的方法 描述
android:duration setDuration(long) 指定動畫持續(xù)時間浑度,單位毫秒
android:fillAfter setFillAfter(boolean) 設(shè)置為true時,指動畫結(jié)束時界面會停留在動畫播放完時的界面奕删,默認(rèn)false
android:fillBefore setFillBefore(boolean) 指動畫結(jié)束時畫面停留在此動畫的第一幀
android:fillEnabled setFillEnabled(boolean) 該方法用于使能填充效果。當(dāng)該方法設(shè)置為true時疗认,將執(zhí)行setFillBefore和setFillAfter方法完残,否則將忽略setFillBefore和setFillAfter方法
android:interpolator setInterpolator(Interpolator) 指定動畫的插值器類型,比如常見類型有
accelerate_interpolator 加速-動畫插入器横漏;
decelerate_interpolator 減速- 動畫插入器谨设;
accelerate_decelerate_interpolator 加速-減速 動畫插入器
android:repeatCount setRepeatCount(int) 指定動畫的重復(fù)次數(shù)
android:repeatMode setRepeatMode(int) 定義動畫的重復(fù)模式,該類中指定了兩個常量值
RESTART 值為1缎浇,表示重新開始
REVERSE 值為2扎拣,表示play backward
android:startOffset setStartOffset(long) 動畫之間的時間間隔,從上次動畫停多少時間開始執(zhí)行下個動畫
android:zAdjustment setZAdjustment(int) 定義動畫的Z Order的改變素跺,有三個常量值:
ZORDER_NORMAL 值為0二蓝,保持Z Order不變
ZORDER_TOP 值為1,保持在最上層
ZORDER_BOTTOM值為-1指厌,保持在最下層

使用

文件存放位置:

res/anim/filename.xml

資源引用:

In Java: R.anim.filename
In XML: @[package:]anim/filename

XML中實(shí)現(xiàn)通常做法是:

  1. 對應(yīng)目錄下定義一個動畫文件(在Android studio中直接new --> android resources file刊愚,然后選擇對應(yīng)的root標(biāo)簽和目錄即可,會自動創(chuàng)建anim文件夾)
  2. 在資源文件中添加標(biāo)簽等具體的動畫屬性值
  3. 在代碼中使用AnimationUtils來加載定義好的動畫文件踩验,會返回一個Animation對象鸥诽,然后將其附在view控件上即可

Animation animation = AnimationUtils.loadAnimation(this, R.anim.scal);
imageView.startAnimation(animation);

代碼實(shí)現(xiàn)通常做法:

  1. 創(chuàng)建一個AnimationSet對象商玫,并設(shè)置相關(guān)屬性,比如插值器等牡借,后續(xù)會具體講解
  2. 創(chuàng)建你想要的某一種或多種動畫對象拳昌,包括動畫執(zhí)行時間等
  3. 然后將這些對象添加到這個AnimationSet對象中
  4. 使用控件對象開始執(zhí)行這個動畫集合

AnimationSet animationSet = new AnimationSet(true);
比如創(chuàng)建一個縮放動畫ScaleAnimation scale;
animationSet.addAnimation(scale);
imageView.startAnimation(animationSet);

AnimationSet


這個類對應(yīng)的標(biāo)簽是< set/>,相當(dāng)于一個容器,來存放其他四種動畫或者是子容器的(動畫集合嵌套動畫集合)

<set xmlns:android="http://schemas.android.com/apk/res/android"

    // 指定一個差值器钠龙,如果是調(diào)用系統(tǒng)內(nèi)置差值器炬藤,包名即為android
    android:interpolator="@[package:]anim/interpolator_resource"

    // **獨(dú)有屬性** 如果是true 表示它的所有子元素標(biāo)簽都共用這個差值器
    android:shareInterpolator=["true" | "false"] >
</set>

ScaleAnimation


<scale

    //動畫起始時x軸伸縮尺寸,取值float型俊鱼,1.0表示不變
    android:fromXScale="float"

    //動畫結(jié)束時x軸伸縮尺寸刻像,取值float型,1.0表示不變
    android:toXScale="float"

    //動畫起始時Y軸伸縮尺寸并闲,取值float型细睡,1.0表示不變
    android:fromYScale="float"

    //動畫結(jié)束時Y軸伸縮尺寸,取值float型帝火,1.0表示不變
    android:toYScale="float"

    //縮放的中心點(diǎn)溜徙,x軸點(diǎn)位置
    android:pivotX="float"
    //縮放的中心點(diǎn),Y軸點(diǎn)位置
    android:pivotY="float" />

值得注意的是犀填,這里的縮放的軸心位置pivotX pivotY在xml中依然有三種形式的取值:

  • 50% 自身的百分比
  • 50%p 父容器的百分比
  • 50 具體的數(shù)值

它們都是相當(dāng)于在view的(x,y)坐標(biāo)上加上 軸點(diǎn)的值 確定的位置蠢壹,比如android:pivotX="50%" 那么就表示這個軸點(diǎn)的x位置是 它自身的x坐標(biāo)加上 它自身寬度的一半

privotX = 50%

DEMO
首先定義一個布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.smart.myapplication.animation.ViewAnimationAct">


    <LinearLayout
        android:layout_width="300dp"
        android:background="#00ffff"
        android:layout_centerInParent="true"
        android:gravity="center_horizontal"
        android:layout_height="200dp">

        <ImageView
            android:id="@+id/imageView"
            android:scaleType="center"
            android:layout_gravity="center"
            android:src="@drawable/girl"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </LinearLayout>

    <Button
        android:id="@+id/start_anim"
        android:layout_alignParentBottom="true"
        android:text="縮放"
        android:layout_width="wrap_content"
        android:background="#2efe4f"
        android:layout_centerHorizontal="true"
        android:layout_height="wrap_content"
        />

</RelativeLayout>

xml動畫文件:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator">

    <scale
        android:duration="2000"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:pivotX="50%p"
        android:pivotY="50%p"
        android:toXScale="1.5"
        android:toYScale="1.5" />
 
</set>  

然后在代碼中使用這個動畫文件:
public class ViewAnimationAct extends AppCompatActivity {

    private ImageView imageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_animation);
        imageView = (ImageView) findViewById(R.id.imageView);
        final Animation animation = AnimationUtils.loadAnimation(this, R.anim.scale_anim);

        findViewById(R.id.start_anim).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                imageView.startAnimation(animation);
            }
        });
    }
}

直接看效果(錄屏反應(yīng)慢,實(shí)際動畫時間就兩秒)

縮放動畫

TranslateAnimation


xml中標(biāo)簽中獨(dú)有屬性:

<translate
    android:fromXDelta="float|percent" // 動畫開始的點(diǎn)離當(dāng)前View的 X坐標(biāo)上的差值 
    android:toXDelta="float|percent" // 動畫結(jié)束的點(diǎn)離當(dāng)前View的 X坐標(biāo)上的差值 
    android:fromYDelta="float|percent" // 動畫開始的點(diǎn)離當(dāng)前View的 Y坐標(biāo)上的差值 
    android:toYDelta="float|percent" // 動畫結(jié)束的點(diǎn)離當(dāng)前View的 Y坐標(biāo)上的差值 
 />  

這四個屬性值支持三種形式的參數(shù):

  • view自身寬或者高的百分比九巡,范圍是-100% -- 100%

    • x方向的差值(xDelta)就是取得view自身的width 然后作以百分比作為差值
    • y方向的差值(yDelta)就是取得view自身的height 然后作以百分比作為差值
  • view父View的寬或者高的百分比图贸,范圍是 -100%p -- 100%p

    • x方向的差值(xDelta)就是取得view的父控件的width 然后作以百分比作為差值
    • y方向的差值(yDelta)就是取得view的父控件的height 然后作以百分比作為差值
  • 具體位置的像素值 比如 50

**都是以view的(x,y)坐標(biāo)變換,相當(dāng)于給他一個transitionX冕广,transitionY
**

DEMO:

頁面布局文件(后續(xù)的布局和activity中代碼實(shí)現(xiàn)類似疏日,不在貼出):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.smart.myapplication.animation.ViewAnimationAct">

        <ImageView
            android:id="@+id/imageView"
            android:scaleType="center"
            android:src="@drawable/girl"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

</RelativeLayout>

對應(yīng)的xml中動畫文件:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:duration="2000"
        android:fromXDelta="0%"
        android:fromYDelta="0%"
        android:repeatCount="1"
        android:repeatMode="reverse"
        android:toXDelta="80%"
        android:toYDelta="80%" />
</set>

對應(yīng)的效果

平移動畫

AlphaAnimation


是一種改變透明度的動畫,漸進(jìn)漸出撒汉,默認(rèn)的透明度都是1表示不透明沟优。對應(yīng)< alpha/>標(biāo)簽,兩個獨(dú)有屬性:

<alpha
    android:fromAlpha="float" // 從一個透明度
    android:toAlpha="float"  // 變化到另一個透明度 
/>

這兩個屬性值的取值:透明度范圍為0.0(完全不可見) --- 1.0(不透明)

DEMO
動畫文件:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <alpha
        android:duration="2000"
        android:fromAlpha="1.0"
        android:repeatCount="1"
        android:repeatMode="reverse"
        android:toAlpha="0" />
</set>

對應(yīng)的效果:

漸變動畫

RoateAnimation


旋轉(zhuǎn)動畫,給定一個軸心和旋轉(zhuǎn)的角度睬辐,組成一個旋轉(zhuǎn)的動畫效果挠阁。對應(yīng)的標(biāo)簽是< roate/>

<rotate
    // 旋轉(zhuǎn)的開始角度
    android:fromDegrees="float"

    // 旋轉(zhuǎn)結(jié)束的角度
    android:toDegrees="float"

    // 旋轉(zhuǎn)的軸心,x位置
    android:pivotX="float"

    // 旋轉(zhuǎn)的軸心溯饵,y位置
    android:pivotY="float" />

需要說明的是:

  • 旋轉(zhuǎn)的起始角度可以有正負(fù)侵俗,并且支持任意角度旋轉(zhuǎn),比如從0到720丰刊,那么會旋轉(zhuǎn)兩周
  • privotX 和 privotY 和縮放動畫軸心取值一樣坡慌,也有三種形式,其實(shí)定義的就是圓心的位置

DEMO
動畫文件:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator">

    <rotate
        android:duration="2000"
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="360" />
</set>

對應(yīng)的效果

旋轉(zhuǎn)動畫

上述列舉了每一種動畫獨(dú)有的屬性藻三,但是別忘了他們共有的屬性定義洪橘,比如動畫執(zhí)行完停留的位置控制跪者,重復(fù)播放動畫,多個動畫組合時提供不同的時間偏移等等

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末熄求,一起剝皮案震驚了整個濱河市渣玲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌弟晚,老刑警劉巖忘衍,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異卿城,居然都是意外死亡枚钓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門瑟押,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搀捷,“玉大人,你說我怎么就攤上這事多望∧壑郏” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵怀偷,是天一觀的道長家厌。 經(jīng)常有香客問我,道長椎工,這世上最難降的妖魔是什么饭于? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮维蒙,結(jié)果婚禮上掰吕,老公的妹妹穿的比我還像新娘。我一直安慰自己木西,他們只是感情好畴栖,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布随静。 她就那樣靜靜地躺著八千,像睡著了一般。 火紅的嫁衣襯著肌膚如雪燎猛。 梳的紋絲不亂的頭發(fā)上恋捆,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音重绷,去河邊找鬼沸停。 笑死,一個胖子當(dāng)著我的面吹牛昭卓,可吹牛的內(nèi)容都是我干的愤钾。 我是一名探鬼主播瘟滨,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼能颁!你這毒婦竟也來了杂瘸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤伙菊,失蹤者是張志新(化名)和其女友劉穎败玉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镜硕,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡运翼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了兴枯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片血淌。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖念恍,靈堂內(nèi)的尸體忽然破棺而出六剥,到底是詐尸還是另有隱情,我是刑警寧澤峰伙,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布疗疟,位于F島的核電站,受9級特大地震影響瞳氓,放射性物質(zhì)發(fā)生泄漏策彤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一匣摘、第九天 我趴在偏房一處隱蔽的房頂上張望店诗。 院中可真熱鬧,春花似錦音榜、人聲如沸庞瘸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽擦囊。三九已至,卻和暖如春嘴办,著一層夾襖步出監(jiān)牢的瞬間瞬场,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工涧郊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贯被,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像彤灶,于是被迫代替她去往敵國和親看幼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

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