Android 属性动画(Property Animation) ValueAnimator 的介绍
先說下屬性動畫與視圖動畫的區別:
視圖動畫系統僅提供為 View?對象添加動畫效果的功能,因此,如果您想為非 對象添加動畫效果,則必須實現自己的代碼才能做到。視圖動畫系統也存在一些限制,因為它僅公開 對象的部分方面來供您添加動畫效果;例如,您可以對視圖的縮放和旋轉添加動畫效果,但無法對背景顏色這樣做。
視圖動畫系統的另一個缺點是它只會在繪制視圖的位置進行修改,而不會修改實際的視圖本身。例如,如果您為某個按鈕添加了動畫效果,使其可以在屏幕上移動,該按鈕會正確繪制,但能夠點擊按鈕的實際位置并不會更改,因此您必須通過實現自己的邏輯來處理此事件。
為了更好的里面這句話我也寫了一個demo 就是動畫移動前點擊圖片有Toast 提示,圖片移動之后點擊圖片沒有Toast 提示,點擊移動之后的空白界面卻有Toast 提示,也就是view動畫給圖片設置點擊事件移動之后點擊事件不起作用了,如下圖效果
錄制的問題鼠標沒有錄制出來下面gif 后面圖片不顯示是點擊了移動之后的圖片,后面又顯示了是點擊上面的空白
?
有了屬性動畫系統,您就可以完
全擺脫這些束縛,還可以為任何對象(視圖和非視圖)的任何屬性添加動畫效果,并且實際修改的是對象本身。屬性動畫系統在執行動畫方面也更為強健。概括地講,您可以為要添加動畫效果的屬性(例如顏色、位置或大小)分配 Animator,還可以定義動畫的各個方面,例如多個 Animator 的插值和同步。
不過,視圖動畫系統的設置需要的時間較短,需要編寫的代碼也較少。如果視圖動畫可以完成您需要執行的所有操作,或者現有代碼已按照您需要的方式運行,則無需使用屬性動畫系統。在某些用例中,也可以針對不同的情況同時使用這兩種動畫系統。
屬性動畫的工作原理就不說了,詳情的大家可以看官網?Android Developers 地址
動畫的API 地址如果有忘記的屬性可以點擊查看
ValueAnimator 的介紹:
The main timing engine for property animation that also computes the values for the property to be animated. It has all of the core functionality that calculates animation values and contains the timing details of each animation, information about whether an animation repeats, listeners that receive update events, and the ability to set custom types to evaluate. There are two pieces to animating properties: calculating the animated values and setting those values on the object and property that is being animated.?ValueAnimator?does not carry out the second piece, so you must listen for updates to values calculated by the?ValueAnimator?and modify the objects that you want to animate with your own logic. See the section about?Animating with ValueAnimator?for more information.
大致是說:
動畫效果分為兩個步驟:1 計算添加動畫效果之后的值,以及對要添加動畫效果的對象和屬性設置這些值 2?自己的邏輯修改要添加動畫效果的對象實現動畫,
大致就是 動畫的值改變了之后需要自己手動賦值對象的屬性來實現動畫
ValueAnimator? 里面有3個方法ofInt()?,ofFloat(),ofObject(),
下面說下這2個方法的使用
1 ofInt 實現的動畫如下圖
?1 java 代碼實現方法:
// 設置屬性數值的初始值和結束值ValueAnimator valueAnimator = ValueAnimator.ofInt(0,400, 500, 600, 900, 600, 500, 400, 0);// 動畫時間這里是毫秒valueAnimator.setDuration(3000);// 延遲0.5 毫秒valueAnimator.setStartDelay(500);// 設置動畫次數-1 為重復播放其他次數為n+1次 例如0是1次 1是2次一次類推valueAnimator.setRepeatCount(-1);// 動畫的下次執行開始位置,RESTART表示動畫每次從原始的狀態執行,// REVERSE表示動畫第二次執行要從第一次改變后的狀態逆向執行valueAnimator.setRepeatMode(ValueAnimator.RESTART);// 設置數值變化監聽器,valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator valueAnimator) {// 獲取當前變化的值int currentValue = (Integer) valueAnimator.getAnimatedValue();imageView.setTranslationY(currentValue);}});// 開始動畫valueAnimator.start();
2 xml 代碼實現方法:
// 加載xml文件ValueAnimator animator =(ValueAnimator) AnimatorInflater.loadAnimator(MainActivity.this,R.animator.value_int_animator);animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {// 獲取當前變化的值int currentValue = (Integer) animation.getAnimatedValue();imageView.setTranslationX(currentValue);}});// 開始animator.start();
創建 1個animator的文件夾 然后value_int_animator.xml 的文件 里面的內容如下
<?xml version="1.0" encoding="utf-8"?>
<animator xmlns:android="http://schemas.android.com/apk/res/android"android:valueFrom="0"android:valueTo="300"android:valueType="intType"android:duration="3000"android:repeatCount="10"android:interpolator="@android:anim/accelerate_decelerate_interpolator"android:repeatMode="restart"></animator>
2 ofObject 動畫實現的效果如下
1 java 代碼實現
ValueAnimator valueAnimator = ValueAnimator.ofFloat(1.0f,500f, 800f, 500f, 1.0f);// 動畫時間這里是毫秒valueAnimator.setDuration(3000);// 延遲0.5 毫秒valueAnimator.setStartDelay(500);// 設置動畫次數-1 為重復播放其他次數為n+1次 例如0是1次 1是2次一次類推valueAnimator.setRepeatCount(-1);// 動畫的下次執行開始位置,RESTART表示動畫每次從原始的狀態執行,// REVERSE表示動畫第二次執行要從第一次改變后的狀態逆向執行valueAnimator.setRepeatMode(ValueAnimator.RESTART);// 設置數值變化監聽器,valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator valueAnimator) {// 獲取當前變化的值Float currentValue = (Float) valueAnimator.getAnimatedValue();int curValue = currentValue.intValue();imageView.setTranslationY(curValue);}});// 開始動畫valueAnimator.start();
2 xml 方法實現
// 加載xml文件ValueAnimator animator =(ValueAnimator) AnimatorInflater.loadAnimator(MainActivity.this,R.animator.value_float_animator);animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {// 獲取當前變化的值Float currentValue = (Float) animation.getAnimatedValue();int curValue = currentValue.intValue();imageView.setTranslationX(curValue);}});// 開始animator.start();
創建 1個animator的文件夾 然后value_float_animator.xml 的文件 里面的內容如下
<?xml version="1.0" encoding="utf-8"?>
<animator xmlns:android="http://schemas.android.com/apk/res/android"android:duration="3000"android:interpolator="@android:anim/accelerate_decelerate_interpolator"android:repeatCount="-1"android:repeatMode="restart"android:valueFrom="0"android:valueTo="300"android:valueType="floatType"></animator>
3 ofObject
在說這個之前先說下:ValueAnimator包含?TimeInterpolator?和?TypeEvaluator;前者用于定義動畫插值,后者用于定義如何計算正在添加動畫效果的屬性的值
這里就先不多說了,后期會詳細的介紹,先知道他們的作用即可
實現的動畫如下
代碼試下如下
ValueAnimator valueAnimator = ValueAnimator.ofObject(new TypeEvaluator() {@Overridepublic Object evaluate(float fraction, Object startValue, Object endValue) {PointF point = new PointF();point.x = fraction * 500;point.y = 55 * (fraction * 3) * (fraction * 3) * fraction;return point;}}, new PointF(0, 0));// 動畫時間這里是毫秒valueAnimator.setDuration(3000);// 延遲0.5 毫秒valueAnimator.setStartDelay(500);// 設置動畫次數-1 為重復播放其他次數為n+1次 例如0是1次 1是2次一次類推valueAnimator.setRepeatCount(-1);// 動畫的下次執行開始位置,RESTART表示動畫每次從原始的狀態執行,// REVERSE表示動畫第二次執行要從第一次改變后的狀態逆向執行valueAnimator.setRepeatMode(ValueAnimator.RESTART);// 設置數值變化監聽器,valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator valueAnimator) {PointF pointF = (PointF) valueAnimator.getAnimatedValue();imageView.setX(pointF.x);imageView.setY(pointF.y);}});// 開始動畫valueAnimator.start();
這里先簡單的說下估值器? TypeEvaluator 如果自定義的需要實現??TypeEvaluator 然后在evaluate 里面寫要實現的內容
上面基本就說完了ValueAnimator 動畫了,代碼都有詳細的注意?
最后看到方法里面有一個 ofArgb,改變顏色值的方法,自己也寫了一個demo 感覺使用ofInt 也是可以的
ofArgb 實現的動畫
實現的代碼如下:
ValueAnimator valueAnimator = ValueAnimator.ofArgb(0xFF5C96FF, 0xFFFBC02D,0xFF4FFB2D, 0xFFC2185B, 0xFF00796B);// 動畫時間這里是毫秒valueAnimator.setDuration(3000);// 延遲0.5 毫秒valueAnimator.setStartDelay(500);// 設置動畫次數-1 為重復播放其他次數為n+1次 例如0是1次 1是2次一次類推valueAnimator.setRepeatCount(-1);// 動畫的下次執行開始位置,RESTART表示動畫每次從原始的狀態執行,// REVERSE表示動畫第二次執行要從第一次改變后的狀態逆向執行valueAnimator.setRepeatMode(ValueAnimator.RESTART);// 設置數值變化監聽器,valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator valueAnimator) {// 獲取當前變化的值int currentValue = (Integer) valueAnimator.getAnimatedValue();textView.setBackgroundColor(currentValue);}});// 開始動畫valueAnimator.start();
?
?
總結
以上是生活随笔為你收集整理的Android 属性动画(Property Animation) ValueAnimator 的介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android Dialog 弹框之外的
- 下一篇: 葫芦多少钱啊?