Android屬性動畫之ValueAnimator的介紹


之前兩篇博客,介紹的是ObjectAnimator作用與某一個控件的某一個屬性。但我們的ValueAnimator它本身並不會作用與任何一個屬性,它本身也不會提供任何一種動畫。它簡單的來說,就是一個數值發生器,它可以產生你想要的各種數值。其實,在Android屬性動畫中,如何產生每一步具體實現動畫效果,都是通過ValueAnimator計算出來的。

比如我們現在要實現一個從0~100的位移動畫,ValueAnimator會根據動畫持續的總時間產生一個0~1時間因子,有了這樣一個時間因子。通過相應的變幻,就可以根據你的startValue和endValue來生成相應的值。同時,通過插值器的使用,我們還可以進一步控制每一個時間因子它產生值的一個變化速率。如果我們使用線性插值器,那么它生成數值的時候,就會形成一個線性變化,只要時間相同,它的增量也相同。如果我們使用一個加速度的插值器,那么它的增量變化就會呈現一個二次曲線圖。增長率會越來越快。由於我們的ValueAnimator並不響應任何一個動畫,也不能控制任何一個屬性,所以它並沒有ObjectAnimator使用的那么廣泛。我們還是來看一下如何在程序中使用ValueAnimator吧。

 

這里貼一個計時器的動畫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:

 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參數,這些參數結合起來通過各種各樣的計算方式,就可以產生所有我們想要產生的值。這里不光能產生普通的數據結構,通過泛型同樣可以定義更加復雜的數據結構。

 

比如這里用的泛型是PointF,通過重寫的evaluate方法,來給我們的Point增加各種各樣的計算方式。我們可以修改Point的各種坐標來完成后續的處理。所以,ValueAnimator的功能十分強大,而且很靈活。它可以實現很多意向不到的效果。不僅僅可以使用在動畫中,在Android中的很多地方都可以使用。

 

總結:

1、常用屬性:

translationX\translationY  水平和垂直方向偏移

rotation、rotationX\rotationY  rotation指3D翻轉,rotationX\rotationY指水平和豎直方向的一個旋轉動畫

scaleX\scaleY  X軸方向,和Y軸方向縮放的一個動畫

X\Y  具體會移動到某一個點

alpha  透明度動畫

2、常用的方法、類

ValueAnimator  數值發生器

ObjectAnimator  是ValueAnimator的一個子類,它封裝了ValueAnimator,可以更輕松的使用屬性動畫

AnimatorUpdateListener

AnimatorListenerAdapter  這2個是用來做監聽事件的

PropertyValuesHolder  

AnimatorSet  這2個用來控制集合動畫的一個顯示效果、順序

TypeEvaluators  值計算器

Interpolators  插值器,用來控制具體數值的變化規律


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM