Android 属性动画(Property Animation) ObjectAnimator的介绍
先說下屬性動畫與視圖動畫的區別:
視圖動畫系統僅提供為 View?對象添加動畫效果的功能,因此,如果您想為非 對象添加動畫效果,則必須實現自己的代碼才能做到。視圖動畫系統也存在一些限制,因為它僅公開 對象的部分方面來供您添加動畫效果;例如,您可以對視圖的縮放和旋轉添加動畫效果,但無法對背景顏色這樣做。
視圖動畫系統的另一個缺點是它只會在繪制視圖的位置進行修改,而不會修改實際的視圖本身。例如,如果您為某個按鈕添加了動畫效果,使其可以在屏幕上移動,該按鈕會正確繪制,但能夠點擊按鈕的實際位置并不會更改,因此您必須通過實現自己的邏輯來處理此事件。
為了更好的里面這句話我也寫了一個demo 就是動畫移動前點擊圖片有Toast 提示,圖片移動之后點擊圖片沒有Toast 提示,點擊移動之后的空白界面卻有Toast 提示,也就是view動畫給圖片設置點擊事件移動之后點擊事件不起作用了,如下圖效果
錄制的問題鼠標沒有錄制出來下面gif 后面圖片不顯示是點擊了移動之后的圖片,后面又顯示了是點擊上面的空白
?
有了屬性動畫系統,您就可以完
全擺脫這些束縛,還可以為任何對象(視圖和非視圖)的任何屬性添加動畫效果,并且實際修改的是對象本身。屬性動畫系統在執行動畫方面也更為強健。概括地講,您可以為要添加動畫效果的屬性(例如顏色、位置或大小)分配 Animator,還可以定義動畫的各個方面,例如多個 Animator 的插值和同步。
不過,視圖動畫系統的設置需要的時間較短,需要編寫的代碼也較少。如果視圖動畫可以完成您需要執行的所有操作,或者現有代碼已按照您需要的方式運行,則無需使用屬性動畫系統。在某些用例中,也可以針對不同的情況同時使用這兩種動畫系統。
屬性動畫的工作原理就不說了,詳情的大家可以看官網?Android Developers 地址
動畫的API 地址如果有忘記的屬性可以點擊查看
ObjectAnimator 的介紹:
A subclass of ValueAnimator?that allows you to set a target object and object property to animate. This class updates the property accordingly when it computes a new value for the animation. You want to use?ObjectAnimator most of the time, because it makes the process of animating values on target objects much easier. However, you sometimes want to use?ValueAnimator?directly because?ObjectAnimator ?has a few more restrictions, such as requiring specific accessor methods to be present on the target object.
大致意思:ValueAnimator的子類,用于設置目標對象和對象屬性以添加動畫效果。此類會在計算出動畫的新值后相應地更新屬性,
ValueAnimator? 和?ObjectAnimator? 明顯的區別
ValueAnimator 動畫需要手動的賦值 (比如不斷控制 值 的變化 最后還需要手動刷新動畫才能顯示出來)
ObjectAnimator 動畫是不需要手動賦值(比如不斷控制 值 的變化ObjectAnimator? 自己會刷新),
?
ObjectAnimator 的方法:
Alpha控制View的透明度
TranslationX控制X方向的位移
TranslationY控制Y方向的位移
ScaleX控制X方向的縮放倍數
ScaleY控制Y方向的縮放倍數
Rotation控制以屏幕方向為軸的旋轉度數
RotationX控制以X軸為軸的旋轉度數
RotationY控制以Y軸為軸的旋轉度數
下面詳細說下每個方法啊
1?translationY 實現的動畫如下
java 代碼實現的方法
   // 指定動畫類型設置屬性數值的初始值和結束值ObjectAnimator translationY =ObjectAnimator.ofFloat(imageView, "translationY", 0, 600);// 延遲0.5 毫秒translationY.setStartDelay(500);// 動畫時間這里是毫秒translationY.setDuration(2000);// 設置動畫次數-1 為重復播放其他次數為n+1次 例如0是1次 1是2次一次類推translationY.setRepeatCount(-1);// 動畫的下次執行開始位置,RESTART表示動畫每次從原始的狀態執行,// REVERSE表示動畫第二次執行要從第一次改變后的狀態逆向執行translationY.setRepeatMode(ValueAnimator.REVERSE);// 開始動畫translationY.start();xml 實現的方法如下
創建 1個animator的文件夾 然后object_animator.xml 的文件 里面的內容如下
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"android:duration="3000"android:propertyName="translationY"android:repeatCount="-1"android:repeatMode="reverse"android:valueFrom="0"android:valueTo="600"android:valueType="floatType" />?然后java 代碼調用xml里面的動畫
  Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_animator);animator.setTarget(imageView);animator.start();2?translationX 實現的動畫如下
?
java 代碼實現的方法
   // 指定動畫類型設置屬性數值的初始值和結束值ObjectAnimator translationY =ObjectAnimator.ofFloat(imageView, "translationX", 0,200, 0, -200, 0);// 延遲0.5 毫秒translationY.setStartDelay(500);// 動畫時間這里是毫秒translationY.setDuration(2000);// 設置動畫次數-1 為重復播放其他次數為n+1次 例如0是1次 1是2次一次類推translationY.setRepeatCount(-1);// 動畫的下次執行開始位置,RESTART表示動畫每次從原始的狀態執行,// REVERSE表示動畫第二次執行要從第一次改變后的狀態逆向執行translationY.setRepeatMode(ValueAnimator.RESTART);// 開始動畫translationY.start();xml 實現的方法如下
創建 1個animator的文件夾 然后object_translationx_animator.xml 的文件 里面的內容如下
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"android:duration="3000"android:propertyName="translationX"android:repeatCount="-1"android:repeatMode="reverse"android:valueFrom="0"android:valueTo="300"android:valueType="floatType" />?然后java 代碼調用xml里面的動畫
 Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_translationx_animator);animator.setTarget(imageView);animator.start();3 平移x和y 實現的動畫如下
java 代碼實現方式如下
   // 這里主要是為了說下合集動畫使用AnimatorSetAnimatorSet translationAnimatorSet = new AnimatorSet();translationAnimatorSet.playTogether(ObjectAnimator.ofFloat(imageView, "translationX", 0, 200).setDuration(2000),ObjectAnimator.ofFloat(imageView, "translationY", 0, 600).setDuration(2000));translationAnimatorSet.start();xml 實現的方法如下
創建 1個animator的文件夾 然后object_translationset_animator.xml 的文件 里面的內容如下
?
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><objectAnimatorandroid:duration="3000"android:propertyName="translationX"android:repeatCount="-1"android:repeatMode="reverse"android:valueFrom="0"android:valueTo="300"android:valueType="floatType" /><objectAnimatorandroid:duration="3000"android:propertyName="translationY"android:repeatCount="-1"android:repeatMode="reverse"android:valueFrom="0"android:valueTo="600"android:valueType="floatType" />
</set>然后java 代碼調用xml里面的動畫
  Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_translationset_animator);animator.setTarget(imageView);animator.start();4? scaleX 實現的動畫如下
java 代碼實現方式如下
   // 指定動畫類型設置屬性數值的初始值和結束值ObjectAnimator scaleY =ObjectAnimator.ofFloat(imageView, "scaleX", 0, 3, 0);// 延遲0.5 毫秒scaleY.setStartDelay(500);// 動畫時間這里是毫秒scaleY.setDuration(2000);// 設置動畫次數-1 為重復播放其他次數為n+1次 例如0是1次 1是2次一次類推scaleY.setRepeatCount(-1);// 動畫的下次執行開始位置,RESTART表示動畫每次從原始的狀態執行,// REVERSE表示動畫第二次執行要從第一次改變后的狀態逆向執行scaleY.setRepeatMode(ValueAnimator.RESTART);// 開始動畫scaleY.start();xml 實現的方法如下
創建 1個animator的文件夾 然后object_scalex_animator.xml 的文件 里面的內容如下
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"android:duration="3000"android:propertyName="scaleX"android:repeatCount="-1"android:repeatMode="reverse"android:valueFrom="0"android:valueTo="2"android:valueType="floatType" />然后java 代碼調用xml里面的動畫
  Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_scalex_animator);animator.setTarget(imageView);animator.start();5?scaleY 實現動畫效果如下
java 代碼實現方式如下
  // 指定動畫類型設置屬性數值的初始值和結束值ObjectAnimator scaleY =ObjectAnimator.ofFloat(imageView, "scaleY", 0, 3, 0);// 延遲0.5 毫秒scaleY.setStartDelay(500);// 動畫時間這里是毫秒scaleY.setDuration(2000);// 設置動畫次數-1 為重復播放其他次數為n+1次 例如0是1次 1是2次一次類推scaleY.setRepeatCount(-1);// 動畫的下次執行開始位置,RESTART表示動畫每次從原始的狀態執行,// REVERSE表示動畫第二次執行要從第一次改變后的狀態逆向執行scaleY.setRepeatMode(ValueAnimator.RESTART);// 開始動畫scaleY.start();xml 實現的方法如下
創建 1個animator的文件夾 然后object_scaley_animator.xml 的文件 里面的內容如下
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"android:duration="3000"android:propertyName="scaleY"android:repeatCount="-1"android:repeatMode="reverse"android:valueFrom="0"android:valueTo="2"android:valueType="floatType" />然后java 代碼調用xml里面的動畫
  Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_scaley_animator);animator.setTarget(imageView);animator.start();6 scale X和Y 實現動畫如下
java 代碼實現如下
    //縮放AnimatorSet animatorSet = new AnimatorSet();animatorSet.playTogether(ObjectAnimator.ofFloat(imageView, "scaleX", 1, 0, 1).setDuration(2000),ObjectAnimator.ofFloat(imageView, "scaleY", 1, 0, 1).setDuration(2000));animatorSet.start();xml 實現的方法如下
創建 1個animator的文件夾 然后object_scalexy_animator.xml 的文件 里面的內容如下
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><objectAnimatorandroid:duration="3000"android:propertyName="scaleX"android:repeatCount="-1"android:repeatMode="reverse"android:valueFrom="0"android:valueTo="2"android:valueType="floatType" /><objectAnimatorandroid:duration="3000"android:propertyName="scaleY"android:repeatCount="-1"android:repeatMode="reverse"android:valueFrom="0"android:valueTo="2"android:valueType="floatType" />
</set>然后在java 代碼中調用動畫
Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_scalexy_animator);animator.setTarget(imageView);animator.start();7 rotationx 實現動畫如下
java 代碼實現如下
  // 指定動畫類型設置屬性數值的初始值和結束值ObjectAnimator rotation =ObjectAnimator.ofFloat(imageView, "rotationX", 0, 360);// 延遲0.5 毫秒rotation.setStartDelay(500);// 動畫時間這里是毫秒rotation.setDuration(2000);// 設置動畫次數-1 為重復播放其他次數為n+1次 例如0是1次 1是2次一次類推rotation.setRepeatCount(-1);// 動畫的下次執行開始位置,RESTART表示動畫每次從原始的狀態執行,// REVERSE表示動畫第二次執行要從第一次改變后的狀態逆向執行rotation.setRepeatMode(ValueAnimator.RESTART);// 開始動畫rotation.start();xml 實現的方法如下
創建 1個animator的文件夾 然后object_rotationx_animator.xml 的文件 里面的內容如下
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"android:duration="3000"android:propertyName="rotationX"android:repeatCount="-1"android:repeatMode="reverse"android:valueFrom="0"android:valueTo="360"android:valueType="floatType" />然后在java 代碼中調用動畫
  Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_rotationx_animator);animator.setTarget(imageView);animator.start();8?rotationy 實現動畫如下
java 代碼實現如下
   // 指定動畫類型設置屬性數值的初始值和結束值ObjectAnimator rotation =ObjectAnimator.ofFloat(imageView, "rotationY", 0, 360);// 延遲0.5 毫秒rotation.setStartDelay(500);// 動畫時間這里是毫秒rotation.setDuration(2000);// 設置動畫次數-1 為重復播放其他次數為n+1次 例如0是1次 1是2次一次類推rotation.setRepeatCount(-1);// 動畫的下次執行開始位置,RESTART表示動畫每次從原始的狀態執行,// REVERSE表示動畫第二次執行要從第一次改變后的狀態逆向執行rotation.setRepeatMode(ValueAnimator.RESTART);// 開始動畫rotation.start();?
xml 實現的方法如下
創建 1個animator的文件夾 然后object_rotationy_animator.xml 的文件 里面的內容如下
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"android:duration="3000"android:propertyName="rotationY"android:repeatCount="-1"android:repeatMode="reverse"android:valueFrom="0"android:valueTo="360"android:valueType="floatType" />然后在java 代碼中調用動畫
 Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_rotationy_animator);animator.setTarget(imageView);animator.start();9??rotation 實現動畫如下
java 代碼實現如下
  // 指定動畫類型設置屬性數值的初始值和結束值ObjectAnimator rotation =ObjectAnimator.ofFloat(imageView, "rotation", 0, 360);// 延遲0.5 毫秒rotation.setStartDelay(500);// 動畫時間這里是毫秒rotation.setDuration(2000);// 設置動畫次數-1 為重復播放其他次數為n+1次 例如0是1次 1是2次一次類推rotation.setRepeatCount(-1);// 動畫的下次執行開始位置,RESTART表示動畫每次從原始的狀態執行,// REVERSE表示動畫第二次執行要從第一次改變后的狀態逆向執行rotation.setRepeatMode(ValueAnimator.RESTART);// 開始動畫rotation.start();xml 實現的方法如下
創建 1個animator的文件夾 然后object_rotation_animator.xml 的文件 里面的內容如下
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"android:duration="3000"android:propertyName="rotation"android:repeatCount="-1"android:repeatMode="reverse"android:valueFrom="0"android:valueTo="360"android:valueType="floatType" />然后java 代碼調用xml 動畫
 Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_rotation_animator);animator.setTarget(imageView);animator.start();當然你也可以使用x和y 組合實現旋轉,這里就不再說了,動畫合集里面寫2個旋轉即可
10?alpha 透明度實現的動畫如下
java 代碼如下
 // 指定動畫類型設置屬性數值的初始值和結束值ObjectAnimator alpha =ObjectAnimator.ofFloat(imageView, "alpha", 1, 0, 1);// 延遲0.5 毫秒alpha.setStartDelay(500);// 動畫時間這里是毫秒alpha.setDuration(2000);// 設置動畫次數-1 為重復播放其他次數為n+1次 例如0是1次 1是2次一次類推alpha.setRepeatCount(-1);// 動畫的下次執行開始位置,RESTART表示動畫每次從原始的狀態執行,// REVERSE表示動畫第二次執行要從第一次改變后的狀態逆向執行alpha.setRepeatMode(ValueAnimator.RESTART);// 開始動畫alpha.start();?
xml 實現的方法如下
創建 1個animator的文件夾 然后object_alpha_animator.xml 的文件 里面的內容如下
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"android:duration="3000"android:propertyName="alpha"android:repeatCount="-1"android:repeatMode="reverse"android:valueFrom="1"android:valueTo="0"android:valueType="floatType" />然后java 代碼調用xml 的動畫如下
   Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_alpha_animator);animator.setTarget(imageView);animator.start();最后 寫一個組合動畫
實現效果如下
java 代碼實現如下
   AnimatorSet animatorSet = new AnimatorSet();animatorSet.playTogether(ObjectAnimator.ofFloat(imageView, "translationY", 0, 600).setDuration(3000),ObjectAnimator.ofFloat(imageView, "scaleX", 1, 0, 1).setDuration(3000),ObjectAnimator.ofFloat(imageView, "rotation", 0, 360).setDuration(3000),ObjectAnimator.ofFloat(imageView, "alpha", 1, 0, 1));animatorSet.start();xml 實現的方法如下
創建 1個animator的文件夾 然后object_set_animator.xml 的文件 里面的內容如下
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><objectAnimatorandroid:duration="3000"android:propertyName="translationY"android:repeatCount="-1"android:repeatMode="reverse"android:valueFrom="0"android:valueTo="600"android:valueType="floatType" /><objectAnimatorandroid:duration="3000"android:propertyName="scaleX"android:repeatCount="-1"android:repeatMode="reverse"android:valueFrom="0"android:valueTo="1"android:valueType="floatType" /><objectAnimatorandroid:duration="3000"android:propertyName="rotation"android:repeatCount="-1"android:repeatMode="reverse"android:valueFrom="0"android:valueTo="360"android:valueType="floatType" /><objectAnimatorandroid:duration="3000"android:propertyName="alpha"android:repeatCount="-1"android:repeatMode="reverse"android:valueFrom="1"android:valueTo="0"android:valueType="floatType" />
</set>然后在java 代碼調用xml 動畫如下
     Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_set_animator);animator.setTarget(imageView);animator.start();?
總結
以上是生活随笔為你收集整理的Android 属性动画(Property Animation) ObjectAnimator的介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        