android動畫機制源碼分析(待完善)
本文著重講解Android3.0後推出的屬性動畫框架Property Animation——Animator的相關源碼分析
概述
3.0之前已有的動畫框架——Animation存在一些局限性, Animation框架定義了透明度,旋轉,縮放和位移幾種常見的動畫,而且控制的是整個View,實現原理是每次繪制視圖時View所在的ViewGroup中的drawChild函數獲取該View的Animation的Transformation值,然後調用canvas.concat(transformToApply.getMatrix()),通過矩陣運算完成動畫幀,如果動畫沒有完成,繼續調用invalidate()函數,啟動下次繪制來驅動動畫,動畫過程中的幀之間間隙時間是繪制函數所消耗的時間,可能會導致動畫消耗比較多的CPU資源,最重要的是,動畫改變的只是顯示,並不能改變相應事件作用的位置。3.0之前的動畫我們一般稱為View動畫.而在Animator框架中使用最多的是AnimatorSet和ObjectAnimator配合,使用ObjectAnimator進行更精細化控制,只控制一個對象的一個屬性值,多個ObjectAnimator組合到AnimatorSet形成一個動畫。而且ObjectAnimator能夠自動驅動,可以調用setFrameDelay(longframeDelay)設置動畫幀之間的間隙時間,調整幀率,減少動畫過程中頻繁繪制界面,而在不影響動畫效果的前提下減少CPU資源消耗。因此,Anroid推出的強大的屬性動畫框架,基本可以實現所有的動畫效果。
簡單實例
在分析源碼之前先列出幾個常用的實例.後面的源碼分析也會用到其中的實例.實例1:監聽動畫的過程
public void changMultiplePropertyByValueAnimator(final View v) {
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) v
.getLayoutParams();
PropertyValuesHolder pvh_left = PropertyValuesHolder.ofFloat(
"margin_left", params.leftMargin, 500);
PropertyValuesHolder pvh_top = PropertyValuesHolder.ofFloat(
"margin_top", params.topMargin, 500);
ValueAnimator ani = ValueAnimator.ofPropertyValuesHolder(pvh_left,
pvh_top).setDuration(1000);
ani.addupdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float margin_left = (Float) valueAnimator
.getAnimatedValue("margin_left");
float margin_top = (Float) valueAnimator
.getAnimatedValue("margin_top");
RelativeLayout.LayoutParams p = (LayoutParams) v.getLayoutParams();
p.leftMargin = (int) margin_left;
p.topMargin = (int) margin_top;
v.setLayoutParams(p);
}
});
ani.start();
}
實例2:使用ObjectAnimator動畫改變背景色
/**
* 使用ObjectAnimator直接設置屬性和值
*/
public void changOneProperty(View v) {
ValueAnimator colorAnimator = ObjectAnimator.ofInt(v,
"backgroundColor", 0xffff8080 /*red*/ , 0xff8080ff /*Blue*/ );
colorAnimator.setDuration(1000);
colorAnimator.setEvaluator(new ArgbEvaluator());
colorAnimator.setRepeatCount(ValueAnimator.INFINITE);
colorAnimator.setRepeatMode(ValueAnimator.REVERSE);// ValueAnimator.RESTART
colorAnimator.start();
}
實例3:使用AnimatorSet改變多個屬性.
public void changMultiplePropertyByValueAnimator2(View v) {
/**
* 支持屬性: translationX and translationY: These properties control where
* the View is located as a delta from its left and top coordinates
* which are set by its layout container.
*
* rotation, rotationX, and rotationY: These properties control the
* rotation in 2D (rotation property) and 3D around the pivot point.
*
* scaleX and scaleY: These properties control the 2D scaling of a View
* around its pivot point.
*
* pivotX and pivotY: These properties control the location of the pivot
* point, around which the rotation and scaling transforms occur. By
* default, the pivot point is located at the center of the object.
*
* x and y: These are simple utility properties to describe the final
* location of the View in its container, as a sum of the left and top
* values and translationX and translationY values.
*
* alpha: Represents the alpha transparency on the View. This value is 1
* (opaque) by default, with a value of 0 representing full transparency
* (not visible).
*/
AnimatorSet set = new AnimatorSet();
set.playTogether(
ObjectAnimator.ofFloat(v, "rotation", 0, -90f),
ObjectAnimator.ofFloat(v, "rotationX", 0, 360f),
ObjectAnimator.ofFloat(v, "rotationY", 0, 360f),
ObjectAnimator.ofFloat(v, "translationX", 0, 200f),
ObjectAnimator.ofFloat(v, "translationY", 0, 200f),
ObjectAnimator.ofFloat(v, "scalY", 1, 1.5f),
ObjectAnimator.ofFloat(v, "scalX", 1, 2.0f),
ObjectAnimator.ofFloat(v, "alpan", 1, 0.25f, 1),
ObjectAnimator.ofFloat(v, "translationY", 0, 200f));
//set.playSequentially(animator1,animator2,animator3);
//set.play(ObjectAnimator.ofFloat(v, "rotation", 0, -90f)).with(anim)
set.setDuration(1000);
set.start();
}
實例4:使用PropertyValuesHolder和ObjectAnimator改變多個屬性.
/**
* 使用PropertyValuesHolder: scal alpha
* @param view
*/
public void propertyValuesHolder(View view) {
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f,0f, 1f
Tags:文章來源: