Android 属性动画(Property Animation) ObjectAnimator的介绍
先說下屬性動畫與視圖動畫的區(qū)別:
視圖動畫系統(tǒng)僅提供為 View?對象添加動畫效果的功能,因此,如果您想為非 對象添加動畫效果,則必須實現(xiàn)自己的代碼才能做到。視圖動畫系統(tǒng)也存在一些限制,因為它僅公開 對象的部分方面來供您添加動畫效果;例如,您可以對視圖的縮放和旋轉(zhuǎn)添加動畫效果,但無法對背景顏色這樣做。
視圖動畫系統(tǒng)的另一個缺點是它只會在繪制視圖的位置進行修改,而不會修改實際的視圖本身。例如,如果您為某個按鈕添加了動畫效果,使其可以在屏幕上移動,該按鈕會正確繪制,但能夠點擊按鈕的實際位置并不會更改,因此您必須通過實現(xiàn)自己的邏輯來處理此事件。
為了更好的里面這句話我也寫了一個demo 就是動畫移動前點擊圖片有Toast 提示,圖片移動之后點擊圖片沒有Toast 提示,點擊移動之后的空白界面卻有Toast 提示,也就是view動畫給圖片設置點擊事件移動之后點擊事件不起作用了,如下圖效果
錄制的問題鼠標沒有錄制出來下面gif 后面圖片不顯示是點擊了移動之后的圖片,后面又顯示了是點擊上面的空白
?
有了屬性動畫系統(tǒng),您就可以完
全擺脫這些束縛,還可以為任何對象(視圖和非視圖)的任何屬性添加動畫效果,并且實際修改的是對象本身。屬性動畫系統(tǒng)在執(zhí)行動畫方面也更為強健。概括地講,您可以為要添加動畫效果的屬性(例如顏色、位置或大小)分配 Animator,還可以定義動畫的各個方面,例如多個 Animator 的插值和同步。
不過,視圖動畫系統(tǒng)的設置需要的時間較短,需要編寫的代碼也較少。如果視圖動畫可以完成您需要執(zhí)行的所有操作,或者現(xiàn)有代碼已按照您需要的方式運行,則無需使用屬性動畫系統(tǒng)。在某些用例中,也可以針對不同的情況同時使用這兩種動畫系統(tǒng)。
屬性動畫的工作原理就不說了,詳情的大家可以看官網(wǎng)?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? 明顯的區(qū)別
ValueAnimator 動畫需要手動的賦值 (比如不斷控制 值 的變化 最后還需要手動刷新動畫才能顯示出來)
ObjectAnimator 動畫是不需要手動賦值(比如不斷控制 值 的變化ObjectAnimator? 自己會刷新),
?
ObjectAnimator 的方法:
Alpha控制View的透明度
TranslationX控制X方向的位移
TranslationY控制Y方向的位移
ScaleX控制X方向的縮放倍數(shù)
ScaleY控制Y方向的縮放倍數(shù)
Rotation控制以屏幕方向為軸的旋轉(zhuǎn)度數(shù)
RotationX控制以X軸為軸的旋轉(zhuǎn)度數(shù)
RotationY控制以Y軸為軸的旋轉(zhuǎn)度數(shù)
下面詳細說下每個方法啊
1?translationY 實現(xiàn)的動畫如下
java 代碼實現(xiàn)的方法
// 指定動畫類型設置屬性數(shù)值的初始值和結束值ObjectAnimator translationY =ObjectAnimator.ofFloat(imageView, "translationY", 0, 600);// 延遲0.5 毫秒translationY.setStartDelay(500);// 動畫時間這里是毫秒translationY.setDuration(2000);// 設置動畫次數(shù)-1 為重復播放其他次數(shù)為n+1次 例如0是1次 1是2次一次類推translationY.setRepeatCount(-1);// 動畫的下次執(zhí)行開始位置,RESTART表示動畫每次從原始的狀態(tài)執(zhí)行,// REVERSE表示動畫第二次執(zhí)行要從第一次改變后的狀態(tài)逆向執(zhí)行translationY.setRepeatMode(ValueAnimator.REVERSE);// 開始動畫translationY.start();
xml 實現(xiàn)的方法如下
創(chuàng)建 1個animator的文件夾 然后object_animator.xml 的文件 里面的內(nèi)容如下
<?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 代碼調(diào)用xml里面的動畫
Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_animator);animator.setTarget(imageView);animator.start();
2?translationX 實現(xiàn)的動畫如下
?
java 代碼實現(xiàn)的方法
// 指定動畫類型設置屬性數(shù)值的初始值和結束值ObjectAnimator translationY =ObjectAnimator.ofFloat(imageView, "translationX", 0,200, 0, -200, 0);// 延遲0.5 毫秒translationY.setStartDelay(500);// 動畫時間這里是毫秒translationY.setDuration(2000);// 設置動畫次數(shù)-1 為重復播放其他次數(shù)為n+1次 例如0是1次 1是2次一次類推translationY.setRepeatCount(-1);// 動畫的下次執(zhí)行開始位置,RESTART表示動畫每次從原始的狀態(tài)執(zhí)行,// REVERSE表示動畫第二次執(zhí)行要從第一次改變后的狀態(tài)逆向執(zhí)行translationY.setRepeatMode(ValueAnimator.RESTART);// 開始動畫translationY.start();
xml 實現(xiàn)的方法如下
創(chuàng)建 1個animator的文件夾 然后object_translationx_animator.xml 的文件 里面的內(nèi)容如下
<?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 代碼調(diào)用xml里面的動畫
Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_translationx_animator);animator.setTarget(imageView);animator.start();
3 平移x和y 實現(xiàn)的動畫如下
java 代碼實現(xiàn)方式如下
// 這里主要是為了說下合集動畫使用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 實現(xiàn)的方法如下
創(chuàng)建 1個animator的文件夾 然后object_translationset_animator.xml 的文件 里面的內(nèi)容如下
?
<?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 代碼調(diào)用xml里面的動畫
Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_translationset_animator);animator.setTarget(imageView);animator.start();
4? scaleX 實現(xiàn)的動畫如下
java 代碼實現(xiàn)方式如下
// 指定動畫類型設置屬性數(shù)值的初始值和結束值ObjectAnimator scaleY =ObjectAnimator.ofFloat(imageView, "scaleX", 0, 3, 0);// 延遲0.5 毫秒scaleY.setStartDelay(500);// 動畫時間這里是毫秒scaleY.setDuration(2000);// 設置動畫次數(shù)-1 為重復播放其他次數(shù)為n+1次 例如0是1次 1是2次一次類推scaleY.setRepeatCount(-1);// 動畫的下次執(zhí)行開始位置,RESTART表示動畫每次從原始的狀態(tài)執(zhí)行,// REVERSE表示動畫第二次執(zhí)行要從第一次改變后的狀態(tài)逆向執(zhí)行scaleY.setRepeatMode(ValueAnimator.RESTART);// 開始動畫scaleY.start();
xml 實現(xiàn)的方法如下
創(chuàng)建 1個animator的文件夾 然后object_scalex_animator.xml 的文件 里面的內(nèi)容如下
<?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 代碼調(diào)用xml里面的動畫
Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_scalex_animator);animator.setTarget(imageView);animator.start();
5?scaleY 實現(xiàn)動畫效果如下
java 代碼實現(xiàn)方式如下
// 指定動畫類型設置屬性數(shù)值的初始值和結束值ObjectAnimator scaleY =ObjectAnimator.ofFloat(imageView, "scaleY", 0, 3, 0);// 延遲0.5 毫秒scaleY.setStartDelay(500);// 動畫時間這里是毫秒scaleY.setDuration(2000);// 設置動畫次數(shù)-1 為重復播放其他次數(shù)為n+1次 例如0是1次 1是2次一次類推scaleY.setRepeatCount(-1);// 動畫的下次執(zhí)行開始位置,RESTART表示動畫每次從原始的狀態(tài)執(zhí)行,// REVERSE表示動畫第二次執(zhí)行要從第一次改變后的狀態(tài)逆向執(zhí)行scaleY.setRepeatMode(ValueAnimator.RESTART);// 開始動畫scaleY.start();
xml 實現(xiàn)的方法如下
創(chuàng)建 1個animator的文件夾 然后object_scaley_animator.xml 的文件 里面的內(nèi)容如下
<?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 代碼調(diào)用xml里面的動畫
Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_scaley_animator);animator.setTarget(imageView);animator.start();
6 scale X和Y 實現(xiàn)動畫如下
java 代碼實現(xiàn)如下
//縮放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 實現(xiàn)的方法如下
創(chuàng)建 1個animator的文件夾 然后object_scalexy_animator.xml 的文件 里面的內(nèi)容如下
<?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 代碼中調(diào)用動畫
Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_scalexy_animator);animator.setTarget(imageView);animator.start();
7 rotationx 實現(xiàn)動畫如下
java 代碼實現(xiàn)如下
// 指定動畫類型設置屬性數(shù)值的初始值和結束值ObjectAnimator rotation =ObjectAnimator.ofFloat(imageView, "rotationX", 0, 360);// 延遲0.5 毫秒rotation.setStartDelay(500);// 動畫時間這里是毫秒rotation.setDuration(2000);// 設置動畫次數(shù)-1 為重復播放其他次數(shù)為n+1次 例如0是1次 1是2次一次類推rotation.setRepeatCount(-1);// 動畫的下次執(zhí)行開始位置,RESTART表示動畫每次從原始的狀態(tài)執(zhí)行,// REVERSE表示動畫第二次執(zhí)行要從第一次改變后的狀態(tài)逆向執(zhí)行rotation.setRepeatMode(ValueAnimator.RESTART);// 開始動畫rotation.start();
xml 實現(xiàn)的方法如下
創(chuàng)建 1個animator的文件夾 然后object_rotationx_animator.xml 的文件 里面的內(nèi)容如下
<?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 代碼中調(diào)用動畫
Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_rotationx_animator);animator.setTarget(imageView);animator.start();
8?rotationy 實現(xiàn)動畫如下
java 代碼實現(xiàn)如下
// 指定動畫類型設置屬性數(shù)值的初始值和結束值ObjectAnimator rotation =ObjectAnimator.ofFloat(imageView, "rotationY", 0, 360);// 延遲0.5 毫秒rotation.setStartDelay(500);// 動畫時間這里是毫秒rotation.setDuration(2000);// 設置動畫次數(shù)-1 為重復播放其他次數(shù)為n+1次 例如0是1次 1是2次一次類推rotation.setRepeatCount(-1);// 動畫的下次執(zhí)行開始位置,RESTART表示動畫每次從原始的狀態(tài)執(zhí)行,// REVERSE表示動畫第二次執(zhí)行要從第一次改變后的狀態(tài)逆向執(zhí)行rotation.setRepeatMode(ValueAnimator.RESTART);// 開始動畫rotation.start();
?
xml 實現(xiàn)的方法如下
創(chuàng)建 1個animator的文件夾 然后object_rotationy_animator.xml 的文件 里面的內(nèi)容如下
<?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 代碼中調(diào)用動畫
Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_rotationy_animator);animator.setTarget(imageView);animator.start();
9??rotation 實現(xiàn)動畫如下
java 代碼實現(xiàn)如下
// 指定動畫類型設置屬性數(shù)值的初始值和結束值ObjectAnimator rotation =ObjectAnimator.ofFloat(imageView, "rotation", 0, 360);// 延遲0.5 毫秒rotation.setStartDelay(500);// 動畫時間這里是毫秒rotation.setDuration(2000);// 設置動畫次數(shù)-1 為重復播放其他次數(shù)為n+1次 例如0是1次 1是2次一次類推rotation.setRepeatCount(-1);// 動畫的下次執(zhí)行開始位置,RESTART表示動畫每次從原始的狀態(tài)執(zhí)行,// REVERSE表示動畫第二次執(zhí)行要從第一次改變后的狀態(tài)逆向執(zhí)行rotation.setRepeatMode(ValueAnimator.RESTART);// 開始動畫rotation.start();
xml 實現(xiàn)的方法如下
創(chuàng)建 1個animator的文件夾 然后object_rotation_animator.xml 的文件 里面的內(nèi)容如下
<?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 代碼調(diào)用xml 動畫
Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_rotation_animator);animator.setTarget(imageView);animator.start();
當然你也可以使用x和y 組合實現(xiàn)旋轉(zhuǎn),這里就不再說了,動畫合集里面寫2個旋轉(zhuǎn)即可
10?alpha 透明度實現(xiàn)的動畫如下
java 代碼如下
// 指定動畫類型設置屬性數(shù)值的初始值和結束值ObjectAnimator alpha =ObjectAnimator.ofFloat(imageView, "alpha", 1, 0, 1);// 延遲0.5 毫秒alpha.setStartDelay(500);// 動畫時間這里是毫秒alpha.setDuration(2000);// 設置動畫次數(shù)-1 為重復播放其他次數(shù)為n+1次 例如0是1次 1是2次一次類推alpha.setRepeatCount(-1);// 動畫的下次執(zhí)行開始位置,RESTART表示動畫每次從原始的狀態(tài)執(zhí)行,// REVERSE表示動畫第二次執(zhí)行要從第一次改變后的狀態(tài)逆向執(zhí)行alpha.setRepeatMode(ValueAnimator.RESTART);// 開始動畫alpha.start();
?
xml 實現(xiàn)的方法如下
創(chuàng)建 1個animator的文件夾 然后object_alpha_animator.xml 的文件 里面的內(nèi)容如下
<?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 代碼調(diào)用xml 的動畫如下
Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_alpha_animator);animator.setTarget(imageView);animator.start();
最后 寫一個組合動畫
實現(xiàn)效果如下
java 代碼實現(xiàn)如下
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 實現(xiàn)的方法如下
創(chuàng)建 1個animator的文件夾 然后object_set_animator.xml 的文件 里面的內(nèi)容如下
<?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 代碼調(diào)用xml 動畫如下
Animator animator = AnimatorInflater.loadAnimator(ObjectAnimatorActivity.this,R.animator.object_set_animator);animator.setTarget(imageView);animator.start();
?
總結
以上是生活随笔為你收集整理的Android 属性动画(Property Animation) ObjectAnimator的介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 葫芦多少钱啊?
- 下一篇: 查看Ubuntu 系统的版本