以前兩篇博客,介紹的是ObjectAnimator做用與某一個控件的某一個屬性。但咱們的ValueAnimator它自己並不會做用與任何一個屬性,它自己也不會提供任何一種動畫。它簡單的來講,就是一個數值發生器,它能夠產生你想要的各類數值。其實,在Android屬性動畫中,如何產生每一步具體實現動畫效果,都是經過ValueAnimator計算出來的。java
好比咱們如今要實現一個從0~100的位移動畫,ValueAnimator會根據動畫持續的總時間產生一個0~1時間因子,有了這樣一個時間因子。經過相應的變幻,就能夠根據你的startValue和endValue來生成相應的值。同時,經過插值器的使用,咱們還能夠進一步控制每個時間因子它產生值的一個變化速率。若是咱們使用線性插值器,那麼它生成數值的時候,就會造成一個線性變化,只要時間相同,它的增量也相同。若是咱們使用一個加速度的插值器,那麼它的增量變化就會呈現一個二次曲線圖。增加率會愈來愈快。因爲咱們的ValueAnimator並不響應任何一個動畫,也不能控制任何一個屬性,因此它並無ObjectAnimator使用的那麼普遍。咱們仍是來看一下如何在程序中使用ValueAnimator吧。android
這裏貼一個計時器的動畫Demo,activity_main.xml:數據結構
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 tools:context="com.example.administrator.valueanimatordemo.MainActivity"> 7 8 <Button 9 android:id="@+id/btn_click" 10 android:layout_width="wrap_content" 11 android:layout_height="wrap_content" 12 android:layout_centerInParent="true" 13 android:text="Click Me" /> 14 15 </RelativeLayout>
而後是Java代碼的實現,MainActivity.java:app
1 package com.example.administrator.valueanimatordemo; 2 3 import android.animation.TypeEvaluator; 4 import android.animation.ValueAnimator; 5 import android.graphics.PointF; 6 import android.os.Bundle; 7 import android.support.v7.app.AppCompatActivity; 8 import android.view.View; 9 import android.widget.Button; 10 11 public class MainActivity extends AppCompatActivity implements View.OnClickListener { 12 13 private Button btn_click; 14 15 @Override 16 protected void onCreate(Bundle savedInstanceState) { 17 super.onCreate(savedInstanceState); 18 setContentView(R.layout.activity_main); 19 initView(); 20 } 21 22 private void initView() { 23 btn_click = (Button) findViewById(R.id.btn_click); 24 btn_click.setOnClickListener(this); 25 } 26 27 @Override 28 public void onClick(View v) { 29 switch (v.getId()) { 30 case R.id.btn_click: 31 // startAnimator1();//計時器實現 32 33 //除了startAnimator1()方法中用的ValueAnimator.ofInt(),咱們還有 34 //ofFloat()、ofObject()這些生成器的方法; 35 //咱們能夠經過ofObject()去實現自定義的數值生成器(請看startAnimator2()方法) 36 startAnimator2(); 37 break; 38 } 39 } 40 41 private void startAnimator1() { 42 final ValueAnimator animator = ValueAnimator.ofInt(0, 100); 43 animator.setDuration(5000); 44 animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 45 @Override 46 public void onAnimationUpdate(ValueAnimator animation) { 47 /** 48 * 經過這樣一個監聽事件,咱們就能夠獲取 49 * 到ValueAnimator每一步所產生的值。 50 * 51 * 經過調用getAnimatedValue()獲取到每一個時間因子所產生的Value。 52 * */ 53 Integer value = (Integer) animation.getAnimatedValue(); 54 btn_click.setText(value + ""); 55 } 56 }); 57 animator.start(); 58 } 59 60 private void startAnimator2() { 61 ValueAnimator animator = ValueAnimator.ofObject(new TypeEvaluator<PointF>() { 62 @Override 63 public PointF evaluate(float fraction, PointF startValue, PointF endValue) { 64 return null; 65 } 66 }); 67 } 68 }
在startAnimator2()方法中,咱們既然是生成咱們自定義的數值,那就須要new 出TypeEvaluator,而且經過泛型指定咱們自定義數值的類型(Demo中暫且爲PointF)。經過重寫了evaluate這樣一個方法,咱們能夠返回各類各樣的值,它的第一個參數fraction就是前面說到的時間因子,它是一個從0~1之間變化的一個數值。還有startValue參數和endValue參數,這些參數結合起來經過各類各樣的計算方式,就能夠產生全部咱們想要產生的值。這裏不光能產生普通的數據結構,經過泛型一樣能夠定義更加複雜的數據結構。ide
好比這裏用的泛型是PointF,經過重寫的evaluate方法,來給咱們的Point增長各類各樣的計算方式。咱們能夠修改Point的各類座標來完成後續的處理。因此,ValueAnimator的功能十分強大,並且很靈活。它能夠實現不少意向不到的效果。不只僅可使用在動畫中,在Android中的不少地方均可以使用。動畫
一、經常使用屬性:this
translationX\translationY 水平和垂直方向偏移lua
rotation、rotationX\rotationY rotation指3D翻轉,rotationX\rotationY指水平和豎直方向的一個旋轉動畫spa
scaleX\scaleY X軸方向,和Y軸方向縮放的一個動畫code
X\Y 具體會移動到某一個點
alpha 透明度動畫
二、經常使用的方法、類
ValueAnimator 數值發生器
ObjectAnimator 是ValueAnimator的一個子類,它封裝了ValueAnimator,能夠更輕鬆的使用屬性動畫
AnimatorUpdateListener
AnimatorListenerAdapter 這2個是用來作監聽事件的
PropertyValuesHolder
AnimatorSet 這2個用來控制集合動畫的一個顯示效果、順序
TypeEvaluators 值計算器
Interpolators 插值器,用來控制具體數值的變化規律