android屬性動畫
一、發展
Android 3.0以前,只有補間動畫和逐幀動畫,合稱檢視動畫
Android 3.0後添加了"屬性動畫"
補間動畫和逐幀動畫缺點:
- 作用物件侷限於View
- 沒有改變View的屬性,只是改變了視覺效果
- 動畫效果單一,只能平移,縮放,旋轉,和改變透明度
屬性動畫改進了上面的缺點:
能作用於所有Java物件,可實現多種動畫效果,不侷限於以上四種
引入了作用領域,
二、工作原理
三、使用
ValueAnimator
ValueAnimator animator=ValueAnimator.ofInt(0,100); animator.setDuration(1000); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { Log.d("jay","value="+animation.getAnimatedValue()); } }); animator.start();
過程為呼叫ValueAnimator的ofInt()方法就可以建立一個ValueAnimator物件,ofInt方法傳入的引數代表將值從0平滑過度到100,setDuration()方法是設定動畫執行時長,addUpdateListener()方法可以監聽動畫執行過程,start()方法啟動動畫
ObjectAnimator
TextView textView=findViewById(R.id.tv); Button btn=findViewById(R.id.btn); final ObjectAnimator animator=ObjectAnimator.ofFloat(textView,"alpha",1f,0f,1f); animator.setDuration(10000); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { animator.start(); } });
實現了點選按鈕textView消失又重現的動畫
ofFloat的引數分別為View物件、動畫效果,開始狀態,中間狀態,結束狀態
第二個引數可以是alpha(改變透明度)、rotation(旋轉)、translationX(水平移動)、scaleY(垂直縮放),還有其他的各種值
原理是通過屬性名找到View的set、get方法進行操作,比如View中存在
public void setAlpha(float value);
public float getAlpha();
則可以改變alpha。
所以我們可以設定任何值,只要在View中建立這個屬性的set和get方法
組合動畫
實現組合動畫功能主要需要藉助AnimatorSet這個類,這個類提供了一個play()方法,如果我們向這個方法中傳入一個Animator物件(ValueAnimator或ObjectAnimator)將會返回一個AnimatorSet.Builder的例項,AnimatorSet.Builder中包括以下四個方法:
- after(Animator anim) 將現有動畫插入到傳入的動畫之後執行
- after(long delay) 將現有動畫延遲指定毫秒後執行
- before(Animator anim) 將現有動畫插入到傳入的動畫之前執行
- with(Animator anim) 將現有動畫和傳入的動畫同時執行
ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);
ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);
AnimatorSet animSet = new AnimatorSet();
animSet.play(rotate).with(fadeInOut).after(moveIn);
animSet.setDuration(5000);
animSet.start();
Animator監聽器
anim.addListener(new AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
});
我們需要實現介面中的四個方法,onAnimationStart()方法會在動畫開始的時候呼叫,onAnimationRepeat()方法會在動畫重複執行的時候呼叫,onAnimationEnd()方法會在動畫結束的時候呼叫,onAnimationCancel()方法會在動畫被取消的時候呼叫。
不監聽全部事件
使用介面卡AnimatorListenerAdapter類,已經幫我們自動實現了所有方法,我們只要重寫需要的方法即可
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
}
});
使用XML編寫動畫
單個動畫
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:valueFrom="1"
android:valueTo="0"
android:valueType="floatType"
android:propertyName="alpha"/>
組合動畫
<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();
參考連結: