概述
可譯為視圖動畫魁莉,分為
- 縮放動畫
- 平移動畫
- 漸變動畫
- 旋轉(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)通常做法是:
- 對應(yīng)目錄下定義一個動畫文件(在Android studio中直接new --> android resources file刊愚,然后選擇對應(yīng)的root標(biāo)簽和目錄即可,會自動創(chuàng)建anim文件夾)
- 在資源文件中添加標(biāo)簽等具體的動畫屬性值
- 在代碼中使用AnimationUtils來加載定義好的動畫文件踩验,會返回一個Animation對象鸥诽,然后將其附在view控件上即可
Animation animation = AnimationUtils.loadAnimation(this, R.anim.scal);
imageView.startAnimation(animation);
代碼實(shí)現(xiàn)通常做法:
- 創(chuàng)建一個AnimationSet對象商玫,并設(shè)置相關(guān)屬性,比如插值器等牡借,后續(xù)會具體講解
- 創(chuàng)建你想要的某一種或多種動畫對象拳昌,包括動畫執(zhí)行時間等
- 然后將這些對象添加到這個AnimationSet對象中
- 使用控件對象開始執(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)加上 它自身寬度的一半
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)的效果
上述列舉了每一種動畫獨(dú)有的屬性藻三,但是別忘了他們共有的屬性定義洪橘,比如動畫執(zhí)行完停留的位置控制跪者,重復(fù)播放動畫,多個動畫組合時提供不同的時間偏移等等