屬性動畫(兩種方式)
阿新 • • 發佈:2018-12-21
1.程式碼形式
package com.bawei.mymvp.animation; import android.animation.Animator; import android.animation.AnimatorInflater; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.TranslateAnimation; import android.widget.Toast; import com.bawei.mymvp.R; /** * ValueAnimator 先改變值,然後 手動賦值 給物件的屬性從而實現動畫;是 間接 對物件屬性進行操作; * ObjectAnimator 先改變值,然後 自動賦值 給物件的屬性從而實現動畫;是 直接 對物件屬性進行操作; */ public class AnimationActivity extends AppCompatActivity implements View.OnClickListener { private View mViewTranslate, mViewProperty, mViewPropertyOther; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_animation); init(); } private void init() { mViewTranslate = findViewById(R.id.view_translate); mViewProperty = findViewById(R.id.view_property); mViewPropertyOther = findViewById(R.id.view_property_other); mViewTranslate.setOnClickListener(this); mViewProperty.setOnClickListener(this); findViewById(R.id.button_translate).setOnClickListener(this); findViewById(R.id.button_property).setOnClickListener(this); findViewById(R.id.button_property_other).setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.view_translate: Toast.makeText(this, "click view_translate", Toast.LENGTH_SHORT).show(); break; case R.id.view_property: Toast.makeText(this, "click view_property", Toast.LENGTH_SHORT).show(); break; case R.id.button_translate: //補間動畫 TranslateAnimation translateAnimation = new TranslateAnimation(0, 500, 1.0f, 1.0f); translateAnimation.setFillAfter(true); translateAnimation.setDuration(3000); mViewTranslate.startAnimation(translateAnimation); break; case R.id.button_property: //屬性動畫 //第一步 ObjectAnimator 例項 //例項通過ObjectAnimator.ofFloat得來 //第一個引數,我想要移動的view //第二個引數,我想要執行動畫的名稱 //第三個引數,起點,每一個節點,按照座標點依次移動 final ObjectAnimator translationX = ObjectAnimator.ofFloat(mViewProperty, "translationX", 0, 500, 300, 100, 500); //持續時間 translationX.setDuration(3000); //重複次數。。。。。 translationX.setRepeatCount(0); //開始動畫 translationX.start(); break; case R.id.button_property_other: //X軸平移 ObjectAnimator translation_X = ObjectAnimator.ofFloat(mViewPropertyOther, "translationX", 0,500); //Y軸平移 ObjectAnimator translation_Y = ObjectAnimator.ofFloat(mViewPropertyOther, "translationY", 0,50); //透明度 ObjectAnimator alpha = ObjectAnimator.ofFloat(mViewPropertyOther, "alpha", 1f, 0f); //X軸縮放 ObjectAnimator scaleX = ObjectAnimator.ofFloat(mViewPropertyOther, "scaleX", 1f, 2f); //Y軸縮放 ObjectAnimator scaleY = ObjectAnimator.ofFloat(mViewPropertyOther, "scaleY", 1f, 2f); //旋轉 ObjectAnimator rotation = ObjectAnimator.ofFloat(mViewPropertyOther, "rotation", 1f, 360f); //注意:這裡是AnimatorSet AnimatorSet animatorSet = new AnimatorSet(); animatorSet.setDuration(3000); //大家一起來 animatorSet.playTogether(translation_X, translation_Y, alpha, scaleX, scaleY, rotation); animatorSet.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); // //play的動畫將在after動畫完成後執行 // animatorSet.play(translation_X).after(translation_Y); // //play的動畫將在before動畫之前執行 // animatorSet.play(translation_X).before(translation_Y); // //play的動畫將和with動畫一起執行 // animatorSet.play(translation_X).with(translation_Y); animatorSet.start(); //通過AnimatorInflater.loadAnimator拿到動畫 // Animator anim = AnimatorInflater.loadAnimator(this,R.animator.view_animation); // //通過setTarget方法將要執行動畫的view放置進去 // anim.setTarget(mViewPropertyOther); // anim.start(); break; default: break; } } }
2.第二種在res下建立animator資料夾
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="sequentially"> <objectAnimator android:duration="1000" android:propertyName="translationY" android:valueFrom="0" android:valueTo="500" android:valueType="floatType" /> <set android:ordering="sequentially"> <objectAnimator android:duration="1000" android:propertyName="rotation" android:valueFrom="0" android:valueTo="360" android:valueType="floatType" /> <set android:ordering="together"> <objectAnimator android:duration="1000" android:propertyName="scaleX" android:valueFrom="1" android:valueTo="5" android:valueType="floatType" /> <objectAnimator android:duration="1000" android:propertyName="scaleY" android:valueFrom="1" android:valueTo="5" android:valueType="floatType" /> </set> </set> </set>