nineoldandroids的使用
在學習nineoldandroids的使用之前,我們先來了解Android其他幾種實現動畫效果的方式:
- 逐幀動畫: 類似放幻燈片,不斷循環切換(播放)圖片資源實現視覺上的動畫效果
- 補間動畫:對view進行一系列的動畫操作,包括淡入淡出、縮放、平移、旋轉四種
逐幀動畫
1.定義好動畫文件:(oneshot:只有一次?)
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false" >
<item
android:drawable="@drawable/main_plant_1"
android:duration="100"/>
<item
android:drawable="@drawable/main_plant_2"
android:duration="100"/>
</animation-list>
2.setImageRescource傳入動畫資源,再可通過(AnimationDrawable)~.getBackground()或是… .getDrawable()方法得到AnimationDrawable對象,調用start()即可開始動畫了。
補間動畫
補間動畫顧名思義就是在確定 兩個幀間填補所需的過度幀,所以只需要確定開始幀與結束幀的狀態就OK了。補間動畫有四種:放大縮小、位移、旋轉、漸變。也就是——
AlphaAnimation
:透明度(alpha)漸變效果,對應<alpha/>
標籤。
TranslateAnimation
:位移漸變,需要指定移動點的開始和結束座標,對應<translate/>
標籤。
ScaleAnimation
:縮放漸變,可以指定縮放的參考點,對應<scale/>
標籤。
RotateAnimation
:旋轉漸變,可以指定旋轉的參考點,對應<rotate/>
標籤。
當然還有個<set/>
標籤可以來組合使用這幾種動畫,定義好動畫(其實都是這兩個from,to而已),然後使用也十分簡單,如下:
Animation animation = AnimationUtils.loadAnimation(this,
R.anim.translate_demo);
animation.setRepeatCount(Animation.INFINITE);//循環顯示
imageView.startAnimation(animation);
但是,要實現比較複雜一些的動畫,比如我們要一個可以自動展開的扇形動畫,顯然依靠這兩種動畫方式是不夠的。幸運的是Android自從3.0開始引入了一種全新的動畫模式,這也就是屬性動畫了。屬性動畫也是如此,顧名思義也就是動態改變其屬性(這裏不僅僅只對view),實現動畫,這個動態改變的過程類似補間動畫,當然我們也一加入一些插值器影響這個動態設置的過程,實現更加絢麗的效果。
接下來真正進入到主題,nineoldandroids是一個兼容3.0以前的開源的動畫框架,在3.0以前我們也能以此來使用屬性動畫來實現複雜的動畫效果。
ValueAnimatior
屬性動畫的運行機制是通過不斷地對值進行操作來實現的,而初始值和結束值之間的動畫過渡就是由ValueAnimator這個類來負責計算的。
ofInt()
ofFloat()
ofObject()
ObjectAnimatior
ObjectAnimator.ofFloat(view, 屬性(具備getter&setter,並能具備變化的動作,比如刷新界面的動作),起始值,終點值)
AnimatorSet
- 組合動畫
- before(Animator anim)
- after(Animator anim)
- after(long delay)
- with(Animator anim)
- play()
XML編寫動畫
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially" >
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:valueFrom="-500"
android:valueTo="0"
android:valueType="floatType" >
</objectAnimator>
<set android:ordering="together" >
<objectAnimator
android:duration="3000"
android:propertyName="rotation"
android:valueFrom="0"
android:valueTo="360"
android:valueType="floatType" >
</objectAnimator>
<set android:ordering="sequentially" >
<objectAnimator
android:duration="1500"
android:propertyName="alpha"
android:valueFrom="1"
android:valueTo="0"
android:valueType="floatType" >
</objectAnimator>
<objectAnimator
android:duration="1500"
android:propertyName="alpha"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" >
</objectAnimator>
</set>
</set>
</set>
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);
animator.setTarget(view);
animator.start();
屬性動畫的使用最重要的是理解動態設置屬性這一過程,我們可以自己定義一個屬性然後通過setter,getter方法實現這一動態過程,這在一些自定義View的創建中可以實現你所需要的動畫過程。
(睡覺去……)
下面是一個例子:
自定義實現一個可以動態展開的扇形ImageView:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (null == rectF)
rectF = new RectF(0 - (int)(canvas.getWidth() * 0.414), 0 - (int) (canvas.getHeight() * 0.414),
(int) (canvas.getWidth() * 1.414), (int) (canvas.getHeight() * 1.414));
paint.reset();
paint.setColor(Color.parseColor("#7f000000"));
canvas.drawArc(rectF, 0, 360 - angle, true, paint);
}
public int getAngle() {
return angle;
}
public void setAngle(int angle) {
this.angle = angle;
invalidate();
}
動畫調用:
ValueAnimator angleAnim = ObjectAnimator.ofInt(view, "angle", fromAngle, toAngle);
angleAnim.setDuration(1000);
// angleAnim.setEvaluator(new ArgbEvaluator());
angleAnim.start();
通過”angle”找到getter/setter方法,實現動態設置實現動畫效果。
該對象的屬性必須有get和set方法(方法的格式必須是駝峯式),方法格式爲set(),因爲ObjectAnimator會自動更新屬性,它必須能夠訪問到屬性的setter方法,比如屬性名爲foo,你就需要一個setFoo()方法,如果setter方法不存在,你有三種選擇:
a.添加setter方法
b.使用包裝類。通過該包裝類通過一個有效的setter方法獲取或者改變屬性值的方法,然後應用於原始對象。
c.使用ValueAnimator代替。
也就是說,要具有能讓ObjectAnimator找到的setter 和 getter方法,然後能夠一一對應並且能夠通過刷新界面等方式產生出動畫效果!