1. 程式人生 > >ObjectAnimator之PropertyValuesHolder與Keyframe----實現電話響鈴震動和小球自由拋體效果

ObjectAnimator之PropertyValuesHolder與Keyframe----實現電話響鈴震動和小球自由拋體效果

首先需要實現的倆種效果圖 1.實現電話響鈴震動效果
2.小球自由拋體效果

一、PropertyValuesHolder

1、概述

PropertyValuesHolder這個類的意義就是,它其中儲存了動畫過程中所需要操作的屬性和對應的值。我們通過ofFloat(Object target, String propertyName, float… values)構造的動畫,ofFloat()的內部實現其實就是將傳進來的引數封裝成PropertyValuesHolder例項來儲存動畫狀態。在封裝成PropertyValuesHolder例項以後,後期的各種操作也是以PropertyValuesHolder為主的。 
說到這裡,大家就知道這個PropertyValuesHolder是有多有用了吧,上面我們也說了,ObjectAnimator給我們提供了一個口子,讓我們自己構造PropertyValuesHolder來構造動畫。

  1. publicstatic ObjectAnimator ofPropertyValuesHolder(Object target,PropertyValuesHolder... values)  
PropertyValuesHolder中有很多函式,有些函式的api等級是11,有些函式的api等級是14和21; 
高api的函式我們就不講了,只講講api 11的函式的用法。有關各個函式的api等級,大家可以參考《Google文件:PropertyValuesHolder》 
首先,我們來看看建立例項的函式:
  1. publicstatic PropertyValuesHolder ofFloat(String propertyName, 
    float... values)  
  2. publicstatic PropertyValuesHolder ofInt(String propertyName, int... values)   
  3. publicstatic PropertyValuesHolder ofObject(String propertyName, TypeEvaluator evaluator,Object... values)  
  4. publicstatic PropertyValuesHolder ofKeyframe(String propertyName, Keyframe... values)  
這裡總共有四個建立例項的方法,這一段我們著重講ofFloat、ofInt和ofObject的用法,ofKeyframe我們單獨講。

2、PropertyValuesHolder之ofFloat()、ofInt()

(1)ofFloat()、ofInt()

我們先來看看它們的建構函式:
  1. publicstatic PropertyValuesHolder ofFloat(String propertyName, float... values)  
  2. publicstatic PropertyValuesHolder ofInt(String propertyName, int... values)   
其中:

  • propertyName:表示ObjectAnimator需要操作的屬性名。即ObjectAnimator需要通過反射查詢對應屬性的setProperty()函式的那個property.
  • values:屬性所對應的引數,同樣是可變長引數,可以指定多個,還記得我們在ObjectAnimator中講過,如果只指定了一個,那麼ObjectAnimator會通過查詢getProperty()方法來獲得初始值。
  • 讓我們看一下ObjectAnimator的ofFloat是怎麼樣的:
  1. publicstatic ObjectAnimator ofFloat(Object target, String propertyName, float... values);  
看到沒,在ObjectAnimator.ofFloat中只比PropertyValuesHolder的ofFloat多了一個target,其它都是完全一樣的! 
好了,我們在講完PropertyValuesHolder的ofFloat函式以後,我們再來看看如何將構造的PropertyValuesHolder例項設定進ObjectAnimator吧。 

(2)、ObjectAnimator.ofPropertyValuesHolder()

在開篇時,我們也講了ObjectAnimator給我們提供了一個設定PropertyValuesHolder例項的入口:
  1. publicstatic ObjectAnimator ofPropertyValuesHolder(Object target,PropertyValuesHolder... values)   
其中:
  • target:指需要執行動畫的控制元件
  • values:是一個可變長引數,可以傳進去多個PropertyValuesHolder例項,由於每個PropertyValuesHolder例項都會針對一個屬性做動畫,所以如果傳進去多個PropertyValuesHolder例項,將會對控制元件的多個屬性同時做動畫操作。 

(3)、示例

下面我們就舉個例子來如何通過PropertyValuesHolder的ofFloat、ofInt來做動畫的。 
效果圖如下: 

這個動畫很簡單,就是在點選按鈕的時候,給textView做動畫,框架程式碼就不再講了,我們主要來看看操作textview動畫的程式碼。
動畫程式碼為:
  1. PropertyValuesHolder rotationHolder = PropertyValuesHolder.ofFloat("Rotation", 60f, -60f, 40f, -40f, -20f, 20f, 10f, -10f, 0f);  
  2. PropertyValuesHolder colorHolder = PropertyValuesHolder.ofInt("BackgroundColor"0xffffffff0xffff00ff0xffffff000xffffffff);  
  3. ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(mTextView, rotationHolder, colorHolder);  
  4. animator.setDuration(3000);  
  5. animator.setInterpolator(new AccelerateInterpolator());  
  6. animator.start();  
在這裡,我們建立了兩個PropertyValuesHolder例項,第一個rotationHolder:
  1. PropertyValuesHolder rotationHolder = PropertyValuesHolder.ofFloat("Rotation", 60f, -60f, 40f, -40f, -20f, 20f, 10f, -10f, 0f);  
使用ofFloat函式建立,屬性值是Rotation,對應的是View類中SetRotation(float rotation)函式。後面傳進去很多值,讓其左右擺動。
第二是動畫是改變背景色的colorHolder
  1. PropertyValuesHolder colorHolder = PropertyValuesHolder.ofInt("BackgroundColor"0xffffffff0xffff00ff0xffffff000xffffffff);  
這裡使用的是ofInt函式建立的,它操作的屬性是BackgroundColor,對應的是View類中的setBackgroundColor(int color)函式,後面傳進去的16進位制顏色值讓其在這些顏色值間變化。
最後通過ObjectAnimator.ofPropertyValuesHolder將rotationHolder、colorHolder設定給mTextView,構造出ObjectAnimator物件。然後開始動畫即可
  1. ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(mTextView, rotationHolder, colorHolder);  
  2. animator.setDuration(3000);  
  3. animator.setInterpolator(new AccelerateInterpolator());  
  4. animator.start();  
好了,到這裡有關PropertyValuesHolder的ofInt和ofFloat函式的用法就講完了,大家可以看到PropertyValuesHolder使用起來也很容易,下面我們再來看看PropertyValuesHolder的ofObject的使用方法。 
原始碼在文章底部給出

3、PropertyValuesHolder之ofObject()

(1)、概述

我們先來看一下ofObject的建構函式
  1. publicstatic PropertyValuesHolder ofObject(String propertyName, TypeEvaluator evaluator,Object... values)  
  • propertyName:ObjectAnimator動畫操作的屬性名;
  • evaluator:Evaluator例項,Evaluator是將當前動畫進度計算出當前值的類,可以使用系統自帶的IntEvaluator、FloatEvaluator也可以自定義,有關Evaluator的知識,大家可以參考《Animation動畫詳解(五)——ValueAnimator高階進階(一)》
  • values:可變長引數,表示操作動畫屬性的值 
它的各個引數與ObjectAnimator.ofObject的類似,只是少了target引數而已
  1. publicstatic ObjectAnimator ofObject(Object target, String propertyName,TypeEvaluator evaluator, Object... values)  

(2)、示例

下面我們就講講PropertyValuesHolder.ofObject()函式的用法 
本示例的效果圖如下:

這裡實現的效果通過自字義的CharEvaluator來自動實現字母的改變與計算。 
首先是自定義一個CharEvaluator,通過進度值來自動計算出當前的字母:

  1. publicclass CharEvaluator implements TypeEvaluator<Character> {  
  2.     @Override
  3.     public Character evaluate(float fraction, Character startValue, Character endValue) {  
  4.         int startInt  = (int)startValue;  
  5.         int endInt = (int)endValue;  
  6.         int curInt = (int)(startInt + fraction *(endInt - startInt));  
  7.         char result = (char)curInt;  
  8.         return result;  
  9.     }  
  10. }  
這個CharEvaluator也是直接從這篇文章中拿過來的,強烈建議大家對這個系列文章從頭開始看。 
從CharEvaluator中可以看出,從CharEvaluator中產出的動畫中間值型別為Character型別。TextView中雖然有setText(CharSequence text) 函式,但這個函式的引數型別是CharSequence,而不是Character型別。所以我們要自定義一個類派生自TextView來改變TextView的字元
  1. publicclass MyTextView extends TextView {  
  2.     public MyTextView(Context context, AttributeSet attrs) {  
  3.         super(context, attrs);  
  4.     }  
  5.     publicvoid setCharText(Character character){  
  6.         setText(String.valueOf(character));  
  7.     }  
  8. }  
在這裡,我們定義了一個方法setCharText(Character character),引數就是Character型別,我們知道這個方法所對應的屬性是CharText; 
最後MyActivity,在點選按鈕的時候開始動畫,核心程式碼為:
  1. publicclass MyActivity extends Activity {  
  2.     private Button btn;  
  3.     private TextView mTextView;  
  4.     private MyTextView mMyTv;  
  5.     @Override
  6.     publicvoid onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.main);  
  9.         mMyTv = (MyTextView)findViewById(R.id.mytv);  
  10.         btn = (Button) findViewById(R.id.btn);  
  11.         btn.setOnClickListener(new View.OnClickListener() {  
  12.             @Override
  13.             publicvoid onClick(View v) {  
  14.                 doOfObjectAnim();  
  15.             }  
  16.         });  
  17.     }  
  18.     privatevoid doOfObjectAnim(){  
  19.         PropertyValuesHolder charHolder = PropertyValuesHolder.ofObject("CharText",new CharEvaluator(),new Character('A'),new Character(

    相關推薦

    ObjectAnimatorPropertyValuesHolderKeyframe----實現電話響鈴震動小球自由效果

    首先需要實現的倆種效果圖 1.實現電話響鈴震動效果 2.小球自由拋體效果 一、PropertyValuesHolder 1、概述 PropertyV

    Nginx 服務器 Nginxtomcat實現負載均衡

    nobody 服務器 listen server events 本文講解我們如何使用Nginx做反向帶服務器,實現nginx與tomcat服務器集群做負載均衡。一、nginx與tomcat實現負載均衡1、在/usr/local/ngnix/conf 創建文件 nginx-tomcat.

    android.animation(5) - PropertyValuesHolderKeyframe(轉)

    狀態 一個 通過 返回值 成對 1.0 內部實現 分代 tail 前幾篇給大家講了ValueAnimator、ObjectAnimator的知識,講解了它們ofInt(),ofFloat(),ofObject()函數的用法。細心的同學可能會註意到,ValueAnima

    Web前端攻城獅培養計劃HTML5CSS3實現動態網頁

    整體 script 靜態 觸發 我們 發展方向 web前端 事件 會有 步驟1: 初識HTML5本階段內容主要涵蓋HTML5新增、刪除標簽、標簽屬性變化以及HTML5布局知識。通過本階段學習,大家可以運用HTML5標簽輕松實現網頁音樂播放器和視頻播放器,熟練運用HTML5的

    SpringMVC 檔案下載 --- IONIO實現及其效能比較

    我的Controller類:FileController.javapackage aboo.controller; import aboo.bean.FileInfo; import aboo.service.FileService; import io.swagger.annotations.Api; i

    Python-GUI程式設計 Tkinter 記事本實現心得

    在這裡介紹一下tkinter和我的記事本,同時分享一些方便自學python的網站 引用一句老外的話讓自己顯得高大上一些: MythDebunking: TkInter is ugly on Windows (http://wiki.tcl.tk/864

    Androidshapeselector實現圓角

    shape和selector是Android UI設計中經常用到的,比如我們要自定義一個圓角Button,點選Button有些效果的變化,就要用到shape和selector。可以這樣說,shape和selector在美化控制元件中的作用是至關重要的。 1.Shape

    Python日期時間處理模組(datedatetime)

    本節內容 前言 相關術語的解釋 時間的表現形式 time模組 datetime模組 時間格式碼 總結 前言 在開發工作中,我們經常需要用到日期與時間,如: 作為日誌資訊的內容輸出 計算某個功能的執行時間 用日期命名一個日誌檔案的名稱 記錄或展示某文章的釋出或修改

    apicloudvue實現app首頁頁面跳轉

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="maximum-scale=1.0,m

    菜鳥學習shiro用配置檔案實現登入,身份許可權驗證2

    Maven的和第一篇,一樣直接去複製使用 這篇部落格和上一篇沒有多大的區別,區別之處就是上一篇沒有實現許可權認證,將在這一篇中實現,這裡我們使用四郎給我們提供的內建類IniRealm,來實現登入,身份

    Unity3DUnity用Display實現Game檢視多屏(分屏)效果

    之前見過很多分屏的賽車遊戲,中間螢幕顯示正前方的畫面,兩邊螢幕顯示車窗和後視鏡畫面,一直不知道怎麼實現的,後來在做專案的時候也用到了這樣的技術,所以就去網上搜了一下,結果實現起來非常簡單。首先要先設定好不同的相機來渲染不同的視角,然後在每個相機上有一個TargetDispla

    [轉]opencv3 圖像處理 圖像縮放( pythonc++實現

    space original 註意 libs 波紋 輸出 uil iostream 3.5 轉自:https://www.cnblogs.com/dyufei/p/8205121.html 一. 主要函數介紹 1) 圖像大小變換 cvResize () 原型: void

    mini2440裸機試煉——Uartpc端實現文件、字符傳輸

    調試工具 CP lib 開發 ons htm sub 設置 沒有 1、? 波特率(Baud rate)即調制速率,1波特即指每秒傳輸1個符號。 2、? 非FIFO模

    實現動畫CSSJavaScript對比

    運行時 理解 controls 進行 中間 PE osi 聰明人 為什麽 曾經某個時期,大多數開發者使用 jQuery 給瀏覽器中的元素添加動畫。讓這個淡化,讓那個擴大,很簡單。隨著互動的項目越來越復雜,移動設備的大量增加,表現性能變得越來越重要。Flash 被拋棄,有天賦

    iOS開發OCswift開發混編教程,代理的相互呼叫,block的實現。OC呼叫Swift中的代理, OC呼叫Swift中的Block 閉包

      本文章將從兩個方向分別介紹 OC 與 swift 混編   1. 第一個方向從 swift工程 中引入 oc類    1. 1 如何在swift的類中使用oc類    1.2  如何在swift中實現oc的代理方法  &

    機器學習logistic迴歸演算法程式碼實現

                                           Logistic迴歸演算法與程式

    c++ std::move 原理實現用法總結

    在C++11中,標準庫在<utility>中提供了一個有用的函式std::move,std::move並不能移動任何東西,它唯一的功能是將一個左值強制轉化為右值引用,繼而可以通過右值引用使用該值,以用於移動語義。從實現上講,std::move基本等同於一個型別轉換:static_ca

    入門 js中axios實現後臺互動入口

    格式略 寫不進去 !!! <script src="js/axios.min.js"></script> <script> window.onload = function(){ // 1.第一種 axios

    機器學習AdaBoost原理程式碼實現

    1 2.000000 1.000000 38.500000 66.000000 28.000000 3.000000 3.000000 0.000000 2.000000 5.000000 4.000000 4.000000 0.0

    安卓實現電話撥號資訊的直接傳送

    Android實現電話跳轉介面撥號與直接傳送簡訊 一、電話撥號 下面的是我們的最終的效果圖: 首先我們先來貼一下layout的佈局 <LinearLayout xmlns:android="http://schemas.android.com/