Note3_公共技術點之Android 動畫基礎
來源:http://t.cn/Ry92sKV 公共技術點之Android 動畫基礎
- 傳統View動畫(Tween/Frame)
1.1 Tween 動畫
文件位置:res/anim/filename.xml
編譯資源的數據類型:an Animation
資源引用:
Java:R.anim.filename
XML:@[package:]anim/filename
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource"
android:shareInterpolator=["true" | "false"] >
<alpha
android:fromAlpha="float"
android:toAlpha="float" />
<scale
android:fromXScale="float"
android:toXScale="float"
android:fromYScale="float"
android:toYScale="float"
android:pivotX="float"
android:pivotY="float" />
<translate
android:fromXDelta="float"
android:toXDelta="float"
android:fromYDelta="float"
android:toYDelta="float" />
<rotate
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pivotY="float" />
<set>
...
</set>
</set>
布局文件必須有一個獨立的根元素,可以是<alpha>,<scale>,<translate>,<rotate>,<set>(持有一組其它的動畫元素,甚至可以是內嵌
的set元素)中的一個
1.1.1 <set>
一個持有其它動畫元素的容器<alpha>, <scale>, <translate>,<rotate>或者其它<set> 元素屬性
android:interpolator
應用于動畫的插值器。該值必須是一個指定了插值器資源的引用(不是一個插值器的類名),在平臺中有缺省的插值器資源可以使用,或
者你可以創建自己的插值器資源,可以看下面關于插值器的討論。
android:shareInterpolator
Boolean 值,true:代表在所有的子元素中共享同一個插值器
1.1.2 <alpha>
A fade-in or fade-out animation. Represents an AlphaAnimation. 一個漸入漸出的動畫,對應的java 類為AlphaAnimation。
屬性
android:fromAlpha
android:toAlpha
代表動畫開始和結束時透明度,0.0 表示完全透明,1.0 表示完全不透明,Float 值
1.1.3 <scale>
可以實現動態調控件尺寸的效果,通過設置pivotX 和pivotY 你可以指定image 縮放的中心點,比如:如果這些值是0,則表示左上
角,所有的縮放變化將沿著右下角的軌跡運動。對應的類為:ScaleAnimation
屬性
android:fromXScale
android:toXScale
android:fromYScale
android:toYScale
Float 值,為動畫起始到結束時,X、Y 坐標上的伸縮尺寸
0.0 表示收縮到沒有
1.0 表示正常無伸縮
android:pivotX
android:pivotY
代表縮放的中軸點X/Y 坐標,浮點值
如果我們想表示中軸點為圖像的中心,我們可以把兩個屬性值定義成0.5 或者50%。
1.1.4 <translate>
代表一個水平、垂直的位移。對應的類為TranslateAnimation. 屬性
android:fromXDelta 屬性代表起始X 方向的位置
android:toXDelta
android:fromYDelta
android:toYDelta 屬性代表起始Y 方向的位置
代表動畫起始或者結束X / Y 方向上的位置,Float 或者百分比值
浮點數num%、num%p 分別相對于自身或者父控件
如果以浮點數字表示,是一個絕對值,代表相對自身原始位置的像素值;
如果以num%表示,代表相對于自己的百分比,比如toXDelta 定義為100%就表示在X 方向上移動自己的1 倍距離
如果以num%p 表示,代表相對于父類組件的百分比。
1.1.5 <rotate>
是旋轉動畫,與之對應的Java 類是RotateAnimation
屬性
android:fromDegrees
android:toDegrees
代表起始和結束的角度,浮點值,單位:度
android:pivotX 屬性代表旋轉中心的X 坐標值
android:pivotY 屬性代表旋轉中心的Y 坐標值
Float 值或者百分比
這兩個屬性也有三種表示方式,但是X 軸都是相對方向都是Left,Y 軸都是相對于Top
浮點數、num%、num%p;
數字方式代表相對于自身左邊緣的像素值,
num%方式代表相對于自身左邊緣或頂邊緣的百分比,
num%p 方式代表相對于父容器的左邊緣或頂邊緣的百分比
屬性
android:fromDegrees
android:toDegrees
開始和結束時的弧度位置,單位是度,Float 值
調用代碼
ImageView image = (ImageView) findViewById(R.id.image);
Animation hyperspaceJump = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
image.startAnimation(hyperspaceJump);
另外,在動畫中,如果我們添加了android:fillAfter="true"后,這個動畫執行完之后保持最后的狀態;android:duration="integer"代
表動畫持續的時間,單位為毫秒。
1.1.6 插值器
用于修改一個動畫過程中的速率,可以定義各種各樣的非線性變化函數,比如加速、減速等
在Android 中所有的插值器都是Interpolator 的子類,通過android:interpolator 屬性你可以引用不同的插值器。下面是幾種插值器:
你可以通過下面的方式使用它們:
<set android:interpolator="@android:anim/accelerate_interpolator">
...
</set>
自定義插值器如果你對系統提供的插值器不滿意,我們可以創建一個插值器資源修改插值器的屬性,比如修改AnticipateInterpolator
的加速速率,調整CycleInterpolator 的循環次數等。為了完成這種需求,我們需要創建XML 資源文件,然后將其放于/res/anim 下,
然后再動畫元素中引用即可。我們先來看一下幾種常見的插值器可調整的屬性:
<?xml version="1.0" encoding="utf-8"?>
<InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"
android:attribute_name="value"
/>
我們先來看一下幾種常見的插值器可調整的屬性:
<accelerateDecelerateInterpolator> 無
<accelerateInterpolator> android:factor 浮點值,加速速率,默認為1
<anticipateInterploator> android:tension 浮點值,起始點后退的張力、拉力數,默認為2
<anticipateOvershootInterpolator> android:tension 同上android:extraTension 浮點值,拉力的倍數,默認為1.5(2 * 1.5)
<bounceInterpolator> 無
<cycleInterplolator> android:cycles int,循環的個數,默認為1
<decelerateInterpolator> android:factor 浮點值,減速的速率,默認為1
<linearInterpolator> 無
<overshootInterpolator> 浮點值,超出終點后的張力、拉力,默認為2
比如:res/anim/my_overshoot_interpolator.xml:
<?xml version="1.0" encoding="utf-8"?>
<overshootInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
android:tension="7.0"/>
This animation XML will apply the interpolator:
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/my_overshoot_interpolator"
android:fromXScale="1.0"
android:toXScale="3.0"
android:fromYScale="1.0"
android:toYScale="3.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="700" />
如果簡單的修改插值器的屬性值還不能夠滿足我們的需求,那么就自己來通過實現Interpolator 接口來定義自己的插值器了因為上面所
有的Interpolator 都實現了Interpolator 接口,這個接口定義了一個方法:float getInterpolation(float input); 此方法由系統調
用,input 代表動畫的時間,在0 和1 之間,也就是開始和結束之間。
線性(勻速)插值器定義如下:
public float getInterpolation(float input) {
return input;
}
加速減速插值器定義如下:
public float getInterpolation(float input) {
return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
}