一、概念
ObjectAnimator,繼承ValueAnimator,標簽:<objectAnimator>
對對象進行動畫,調用對象的對應屬性的get/set方法把屬性值設置給對象的對應屬性,直接實現動畫效果。
二、實現
1. XML實現
//res/animator/object_animator.xml
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="alpha"
android:duration="5000"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType"
/>
//布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/main_tv"
android:layout_width="wrap_content"
android:layout_height="100px"
android:layout_centerInParent="true"
android:gravity="center"
android:textColor="#FFFFFF"
android:text="Hello Android!"
android:background="@color/colorPrimary"/>
</RelativeLayout>
//代碼,MainActivity
private void objectAnimatorXML() {
mObjectAnimator = (ObjectAnimator)AnimatorInflater.loadAnimator(this, R.animator.object_animator);
mObjectAnimator.setTarget(mMain_tv);
mObjectAnimator.start();
}
private void stopAnimator() {
mObjectAnimator.cancel();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
objectAnimatorXML();
}
@Override
protected void onDestroy() {
super.onDestroy();
stopAnimator();
}
2. 代碼實現
//布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/main_tv"
android:layout_width="wrap_content"
android:layout_height="100px"
android:layout_centerInParent="true"
android:gravity="center"
android:textColor="#FFFFFF"
android:text="Hello Android!"
android:background="@color/colorPrimary"/>
</RelativeLayout>
//代碼,MainActivity
private void objectAnimatorCode() {
mObjectAnimator.ofFloat(mMain_tv, "alpha", 0, 1)
.setDuration(5000)
.start();
}
private void stopAnimator() {
mObjectAnimator.cancel();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
objectAnimatorCode();
}
@Override
protected void onDestroy() {
super.onDestroy();
stopAnimator();
}
使用Path類同時改變兩個屬性:
private void objectAnimatorCodeWithPath() {
Path path = new Path();
path.moveTo(0,0);
path.lineTo(200,200);
path.lineTo(100,300);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ObjectAnimator.ofFloat(mMain_tv,"translationX", "translationY",path)
.setDuration(5000)
.start();
}
}
三、屬性
android:propertyName:
表示屬性動畫的作用對象的屬性名稱。
常用屬性如下:
alpha,改變透明度,setAlpha
translationX,沿X軸平移,setTranslationX
translationY,沿Y軸平移,setTranslationY
scaleX,沿X軸縮放,setScaleX
scaleY,沿Y軸縮放,setScaleY
rotationX,繞X軸旋轉,setRotationX
rotationY,繞Y軸旋轉,setRotationY
rotation,繞Z軸旋轉,setRotation
android:duration:
表示動畫的時長。
android:valueFrom:
表示屬性的起始值。
android:valueTo:
表示屬性的結束值。
android:startOffset:
表示動畫的延遲時間,當動畫開始后,需要延遲多少毫秒才會真正播放此動畫。
android:repeatCount:
表示動畫的重復次數。默認值為0,其中-1表示無限循環(huán)。
android:repeatMode:
表示動畫的重復模式。有"restart"和"reverse"兩個選項,分別表示連續(xù)重復和逆向重復,連續(xù)重復就是每次都重新開始播放,逆向重復就是第一次播放完以后,第二次會倒著播放,第三次再重頭開始播放,第四次再倒著播放,如此重復。
android:valueType:
表示屬性的類型。有"intType"和"floatType"兩個選項,分別表示屬性的類型為整型和浮點型。另外,如果android:propertyName所指定的屬性表示的是顏色(比如,backgroundColor),那么不需要指定android:valueType,系統(tǒng)會自動對顏色類型的屬性做處理。
四、方法
ObjectAnimator ofObject(Object target, String propertyName,
TypeEvaluator evaluator, Object... values):
主要作用是根據一定的規(guī)則對目標對象的某個屬性進行改變,從而使目標對象實現與該屬性相關的動畫效果。
參數解析:
第一個參數:動畫的實施對象。
第二個參數:屬性名,在動畫的實施對象中必須要有一個public訪問權限的"set屬性名()"方法,在動畫實施過程中,會不停地調用這個set方法給該屬性設置新值。當然,屬性名可以任意指定,但是必須要保證有public訪問權限的"set屬性名()"方法。
第三個參數:估值器,實現TypeEvaluator接口,覆寫evaluate方法,在方法中給出屬性改變的具體實現過程,以達到預期動畫效果。這個步驟是整個屬性動畫的精髓所在,它反映了屬性變化的具體過程。
第四個參數:屬性集合,即屬性的開始點,中途變化點,結束點的具體值。是在evaluate方法中計算屬性值變化的依據數據。