1. 程式人生 > >Android筆記----動畫、屬性動畫

Android筆記----動畫、屬性動畫

好記性不如爛筆頭。


幀動畫

補間動畫:Alpha、Scale、Translation、Rotate

屬性動畫:


屬性動畫常用的幾個類:

ObjectAnimator:物件動畫執行類

ValueAnimator:值動畫執行類

PropertyValuesHolder:屬性存值器

Keyframe:關鍵幀

AnimatorSet:動畫執行集合類

AnimatorUpdateListener:動畫更新監聽

AnimatorListener:動畫執行監聽

AnimatorInflater 動畫載入器

TypeEvaluator 型別估值



實現屬性動畫的方法:

1.呼叫ObjectAnimator的靜態工廠方法建立動畫(ofInt、ofFloat、ofObject);

2.呼叫setXxx()設定動畫持續時間、插值方式、重複次數等;

3.設定監聽事件;

4.呼叫Animator物件的start()方法啟動動畫。


//建立動畫
ObjectAnimator yBouncer = ObjectAnimator.ofFloat(button, "ScaleX",0.0f, 1.0f);
//設定動畫持續時間		
yBouncer.setDuration(2000);
// 設定插值器(用於調節動畫執行過程的速度)
yBouncer.setInterpolator(new LinearInterpolator());
// 設定重複次數(預設為0,表示不重複執行),設定為2表示總共執行3次
yBouncer.setRepeatCount(2);
// 設定重複模式(RESTART或REVERSE),重複次數大於0或INFINITE生效
yBouncer.setRepeatMode(ValueAnimator.RESTART);
// 設定動畫開始的延時時間(200ms)
yBouncer.setStartDelay(200);
// 開始動畫
yBouncer.start();

預設縮放點在button的中間位置,如果要設定在button的(0,0)座標進行縮放,需要新增以下程式碼:

// 設定縮放的中心點
button.setPivotX(0);
button.setPivotY(0);
button.invalidate();

新增監聽:

		ObjectAnimator anim = ObjectAnimator.ofFloat(view, "alpha", 0.5f);
		anim.setDuration(1000);
		anim.addListener(new AnimatorListener() {
		    @Override
		    public void onAnimationStart(Animator animation) {
		        // 動畫開始時呼叫
		    }

		    @Override
		    public void onAnimationRepeat(Animator animation) {
		        // 動畫重複時呼叫
		    }
		    @Override
		    public void onAnimationEnd(Animator animation) {
		        // 動畫結束時呼叫
		        ViewGroup parent = (ViewGroup) view.getParent();
		        if (parent != null)
		            parent.removeView(view);
		    }
		    @Override
		    public void onAnimationCancel(Animator animation) {
		        // 動畫取消時呼叫
		    }
		});
		anim.start();

ValueAnimator:

ValueAnimator animator = ValueAnimator.ofFloat(0f, 200.0f);
// 設定作用物件
animator.setTarget(view);
// 設定執行時間
animator.setDuration(1000);
// 新增動畫更新監聽
animator.addUpdateListener(new AnimatorUpdateListener() {
 @Override
public void onAnimationUpdate(ValueAnimator animation) {
 // 獲取當前值
 Float mValue = (Float) animation.getAnimatedValue();
// 設定橫向偏移量
view.setTranslationX(mValue);
// 設定縱向偏移量
view.setTranslationY(mValue);	        
<span style="white-space:pre">	</span>}
});
animator.start();

PropertyValuesHolder:

		// 獲取view左邊位置
		int left = view.getLeft();
		// 獲取view右邊位置
		int right = view.getRight();
		// 將view左邊增加10畫素
		PropertyValuesHolder pvhLeft = PropertyValuesHolder.ofInt("left", left,
		        left + 10);
		// 將view右邊減少10畫素
		PropertyValuesHolder pvhRight = PropertyValuesHolder.ofInt("right",
		        right, right - 10);
		// 在X軸縮放從原始比例1f,縮小到最小0f,再放大到原始比例1f
		PropertyValuesHolder pvhScaleX = PropertyValuesHolder.ofFloat("scaleX",
		        1f, 0f, 1f);
		// 在Y軸縮放從原始比例1f,縮小到最小0f,再放大到原始比例1f
		PropertyValuesHolder pvhScaleY = PropertyValuesHolder.ofFloat("scaleY",
		        1f, 0f, 1f);
		// 將PropertyValuesHolder交付給ObjectAnimator進行構建
		ObjectAnimator customAnim = ObjectAnimator.ofPropertyValuesHolder(view,
		        pvhLeft, pvhRight, pvhScaleX, pvhScaleY);
		// 設定執行時間(1000ms)
		customAnim.setDuration(1000);
		// 開始動畫
		customAnim.start();

Keyframe:
		// 設定在動畫開始時,旋轉角度為0度
		Keyframe kf0 = Keyframe.ofFloat(0f, 0f);
		// 設定在動畫執行50%時,旋轉角度為360度
		Keyframe kf1 = Keyframe.ofFloat(.5f, 360f);
		// 設定在動畫結束時,旋轉角度為0度
		Keyframe kf2 = Keyframe.ofFloat(1f, 0f);
		// 使用PropertyValuesHolder進行屬性名稱和值集合的封裝
		PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2);
		// 通過ObjectAnimator進行執行
		ObjectAnimator.ofPropertyValuesHolder(view, pvhRotation)
		// 設定執行時間(1000ms)
		.setDuration(3000)
		// 開始動畫
		.start();

ValueAnimator:

		// 型別估值 - 拋物線示例
		TypeEvaluator<PointF> typeEvaluator = new TypeEvaluator<PointF>() {
		    @Override
		    public PointF evaluate(float fraction, PointF startValue,
		            PointF endValue) {
		        float time = fraction * 3;
		        // x方向120px/s ,y方向0.5 * 200 * t * t
		        PointF point = new PointF();
		        point.x = 120 * time;
		        point.y = 0.5f * 200 * time * time;
		        return point;
		    }
		};
		ValueAnimator valueAnimator = ValueAnimator.ofObject(typeEvaluator,
		        new PointF(0, 0));
		valueAnimator.setInterpolator(new LinearInterpolator());
		valueAnimator.setDuration(3000);
		valueAnimator.start();
		
		valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
		    @Override
		    public void onAnimationUpdate(ValueAnimator animation) {
		        PointF point = (PointF) animation.getAnimatedValue();
		        view.setX(point.x);
		        view.setY(point.y);
		    }
		});