android屬性動畫

weixin_43435453發表於2020-11-04

一、發展

Android 3.0以前,只有補間動畫和逐幀動畫,合稱檢視動畫

Android 3.0後新增了"屬性動畫"

補間動畫和逐幀動畫缺點:

  1. 作用物件侷限於View
  2. 沒有改變View的屬性,只是改變了視覺效果
  3. 動畫效果單一,只能平移,縮放,旋轉,和改變透明度

屬性動畫改進了上面的缺點:

能作用於所有Java物件,可實現多種動畫效果,不侷限於以上四種

引入了作用領域,

二、工作原理

android屬性動畫

三、使用

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();

參考連結:

http://blog.csdn.net/guolin_blog/article/details/43536355

https://blog.csdn.net/carson_ho/article/details/72909894

相關文章