Android動畫機制源碼分析(待完善)

分類:編程 時間:2017-02-15

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:監聽動畫的過程

  1. public void changMultiplePropertyByValueAnimator(final View v) {
  2. RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) v
  3. .getLayoutParams();
  4. PropertyValuesHolder pvh_left = PropertyValuesHolder.ofFloat(
  5. "margin_left", params.leftMargin, 500);
  6. PropertyValuesHolder pvh_top = PropertyValuesHolder.ofFloat(
  7. "margin_top", params.topMargin, 500);
  8. ValueAnimator ani = ValueAnimator.ofPropertyValuesHolder(pvh_left,
  9. pvh_top).setDuration(1000);
  10. ani.addupdateListener(new ValueAnimator.AnimatorUpdateListener() {
  11. @Override
  12. public void onAnimationUpdate(ValueAnimator valueAnimator) {
  13. float margin_left = (Float) valueAnimator
  14. .getAnimatedValue("margin_left");
  15. float margin_top = (Float) valueAnimator
  16. .getAnimatedValue("margin_top");
  17. RelativeLayout.LayoutParams p = (LayoutParams) v.getLayoutParams();
  18. p.leftMargin = (int) margin_left;
  19. p.topMargin = (int) margin_top;
  20. v.setLayoutParams(p);
  21. }
  22. });
  23. ani.start();
  24. }

實例2:使用ObjectAnimator動畫改變背景色

  1. /**
  2. * 使用ObjectAnimator直接設置屬性和值
  3. */
  4. public void changOneProperty(View v) {
  5. ValueAnimator colorAnimator = ObjectAnimator.ofInt(v,
  6. "backgroundColor", 0xffff8080 /*red*/ , 0xff8080ff /*Blue*/ );
  7. colorAnimator.setDuration(1000);
  8. colorAnimator.setEvaluator(new ArgbEvaluator());
  9. colorAnimator.setRepeatCount(ValueAnimator.INFINITE);
  10. colorAnimator.setRepeatMode(ValueAnimator.REVERSE);// ValueAnimator.RESTART
  11. colorAnimator.start();
  12. }

實例3:使用AnimatorSet改變多個屬性.

  1. public void changMultiplePropertyByValueAnimator2(View v) {
  2. /**
  3. * 支持屬性: translationX and translationY: These properties control where
  4. * the View is located as a delta from its left and top coordinates
  5. * which are set by its layout container.
  6. *
  7. * rotation, rotationX, and rotationY: These properties control the
  8. * rotation in 2D (rotation property) and 3D around the pivot point.
  9. *
  10. * scaleX and scaleY: These properties control the 2D scaling of a View
  11. * around its pivot point.
  12. *
  13. * pivotX and pivotY: These properties control the location of the pivot
  14. * point, around which the rotation and scaling transforms occur. By
  15. * default, the pivot point is located at the center of the object.
  16. *
  17. * x and y: These are simple utility properties to describe the final
  18. * location of the View in its container, as a sum of the left and top
  19. * values and translationX and translationY values.
  20. *
  21. * alpha: Represents the alpha transparency on the View. This value is 1
  22. * (opaque) by default, with a value of 0 representing full transparency
  23. * (not visible).
  24. */
  25. AnimatorSet set = new AnimatorSet();
  26. set.playTogether(
  27. ObjectAnimator.ofFloat(v, "rotation", 0, -90f),
  28. ObjectAnimator.ofFloat(v, "rotationX", 0, 360f),
  29. ObjectAnimator.ofFloat(v, "rotationY", 0, 360f),
  30. ObjectAnimator.ofFloat(v, "translationX", 0, 200f),
  31. ObjectAnimator.ofFloat(v, "translationY", 0, 200f),
  32. ObjectAnimator.ofFloat(v, "scalY", 1, 1.5f),
  33. ObjectAnimator.ofFloat(v, "scalX", 1, 2.0f),
  34. ObjectAnimator.ofFloat(v, "alpan", 1, 0.25f, 1),
  35. ObjectAnimator.ofFloat(v, "translationY", 0, 200f));
  36. //set.playSequentially(animator1,animator2,animator3);
  37. //set.play(ObjectAnimator.ofFloat(v, "rotation", 0, -90f)).with(anim)
  38. set.setDuration(1000);
  39. set.start();
  40. }

實例4:使用PropertyValuesHolder和ObjectAnimator改變多個屬性.

  1. /**
  2. * 使用PropertyValuesHolder: scal alpha
  3. * @param view
  4. */
  5. public void propertyValuesHolder(View view) {
  6. PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f,0f, 1f
    Tags:

    文章來源:


ads
ads

相關文章
ads

相關文章

ad