android關於屬性動畫的七個使用案例

銳湃發表於2015-09-29
package com.tz.dream.property.animation;

import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
import android.animation.AnimatorInflater;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.animation.TypeEvaluator;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.PointF;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;

@SuppressLint("NewApi")
public class MainActivity extends Activity implements OnClickListener {

	private ImageView imageView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		imageView = (ImageView) findViewById(R.id.iv_property);
		imageView.setOnClickListener(this);
		// api 3.0之前這些個屬性是不存在的
		// imageView.setRotationX(rotationX);
		// imageView.setAlpha(alpha);
		// imageView.setTranslationX(translationX);
	}

	@Override
	public void onClick(View v) {

		// 第一個案例:旋轉
		// target表示作用目標
		// propertyName表示屬性名稱(rotationX:旋轉)
		// values:表示從哪裡旋轉到哪裡
		// ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(v,
		// "rotationY",
		// 0.0f, 360.0f).setDuration(2000);
		// objectAnimator.start();

		// 第二個案例(監聽動畫執行過程)
		// 注:雖然我們輸入的屬性不存在,但是仍然會執行(指的是時間)
		// 非主流用法
		// ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(v, "dream",
		// 0.0f, 50.0f);
		// objectAnimator.setDuration(200);
		// objectAnimator.start();
		// // 新增動畫監聽(監聽動畫執行過程)
		// objectAnimator.addUpdateListener(new AnimatorUpdateListener() {
		// @Override
		// public void onAnimationUpdate(ValueAnimator animation) {
		// // getAnimatedValue:指的是當前時間在某一個時刻對應的value值 (距離/時間=速度)
		// float animatedValue = (float) animation.getAnimatedValue();
		// // imageView.setScaleX(Math.max(0.8f, animatedValue));
		// // imageView.setScaleY(Math.max(0.8f, animatedValue));
		// imageView.setTranslationX(animatedValue);
		// // imageView.setAlpha(alpha);
		// }
		// });

		// 第三個案例:多個動畫同時執行
		// PropertyValuesHolder scaleXholder = PropertyValuesHolder.ofFloat(
		// "scaleX", 0.0f, 1.0f);
		// PropertyValuesHolder scaleYholder = PropertyValuesHolder.ofFloat(
		// "scaleY", 0.0f, 1.0f);
		// ObjectAnimator objectAnimator =
		// ObjectAnimator.ofPropertyValuesHolder(
		// v, scaleXholder, scaleYholder);
		// objectAnimator.setDuration(2000);
		// objectAnimator.start();

		// // 第四個案例------ValueAnimator-------
		// ValueAnimator valueAnimator = ValueAnimator.ofFloat(0.0f, 100.0f);
		// valueAnimator.setDuration(1000);
		// valueAnimator.start();
		// valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
		//
		// @Override
		// public void onAnimationUpdate(ValueAnimator animation) {
		// float animatedValue = (float) animation.getAnimatedValue();
		// // imageView.setScaleX(animatedValue);
		// // imageView.setScaleY(animatedValue);
		// imageView.setTranslationX(animatedValue);
		// }
		// });

		// 第五個案例---實現多個動畫同時執行,實現拋物線效果----估值器

		// 總時間
		// final int duration = 2000;
		// ValueAnimator valueAnimator = new ValueAnimator();
		// valueAnimator.setDuration(duration);
		// valueAnimator.setObjectValues(new PointF(0, 0));
		//
		// // 估值器:可以用來計算我們的view在螢幕當中顯示的位置(運動的軌跡:平移、縮放、拋物線等等......)
		// valueAnimator.setEvaluator(new TypeEvaluator<PointF>() {
		//
		// @Override
		// public PointF evaluate(float fraction, PointF startValue,
		// PointF endValue) {
		// // fraction:表示百分比,代表當前執行到了什麼程度
		// // duration:總時間
		// // t表示當前時間
		// // 百分比: fraction = t/duration
		// // 時間:t = fraction*duration
		// // 速度我們自定義:自已規定速度s = 50px/s
		// // x = t * s
		// // pointF.x: 表示距離
		// // 建立一個點
		// PointF pointF = new PointF();
		// // 計算當前實現
		// float t = fraction * duration / 1000;
		// // 速度=50px/s
		// int s = 100;
		// // 計算當前執行的距離
		// pointF.x = t * s;
		// // pointF.y : y = 1/2*g*t*t;
		// pointF.y = 1 / 2.0f * 98f * t * t;
		//
		// return pointF;
		// }
		// });
		//
		// valueAnimator.start();
		// valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
		//
		// @Override
		// public void onAnimationUpdate(ValueAnimator animation) {
		// PointF pointF = (PointF) animation.getAnimatedValue();
		// imageView.setX(pointF.x);
		// imageView.setY(pointF.y);
		// }
		// });

		// valueAnimator.addListener(new AnimatorListenerAdapter() {
		// @Override
		// public void onAnimationEnd(Animator animation) {
		// super.onAnimationEnd(animation);
		// }
		//
		// });

		// valueAnimator.addListener(new AnimatorListener() {
		//
		// @Override
		// public void onAnimationStart(Animator animation) {
		// // TODO Auto-generated method stub
		//
		// }
		//
		// @Override
		// public void onAnimationRepeat(Animator animation) {
		// // TODO Auto-generated method stub
		//
		// }
		//
		// @Override
		// public void onAnimationEnd(Animator animation) {
		// PropertyValuesHolder scaleXholder = PropertyValuesHolder
		// .ofFloat("scaleX", 0.0f, 1.0f);
		// PropertyValuesHolder scaleYholder = PropertyValuesHolder
		// .ofFloat("scaleY", 0.0f, 1.0f);
		// ObjectAnimator objectAnimator = ObjectAnimator
		// .ofPropertyValuesHolder(imageView, scaleXholder, scaleYholder);
		// objectAnimator.setDuration(2000);
		// objectAnimator.start();
		// }
		//
		// @Override
		// public void onAnimationCancel(Animator animation) {
		// // TODO Auto-generated method stub
		//
		// }
		// });

		// 第六個案例---AnimatorSet動畫集合
		// ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(imageView,
		// "scaleX", 1.0f, 2.0f);
		// ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(imageView,
		// "scaleY", 1.0f, 2.0f);
		// ObjectAnimator translationXAnimator =
		// ObjectAnimator.ofFloat(imageView,
		// "translationX", 0.0f, 100.0f);
		//
		// AnimatorSet animatorSet = new AnimatorSet();
		// animatorSet.setDuration(2000);
		// // animatorSet.playTogether(scaleXAnimator, scaleYAnimator);
		// // animatorSet.start();
		// // 補充知識:思考當我們的縮放動畫執行完畢的時候執行我們的平移動畫?
		// // with:同時執行 after:在誰的後面執行 before:在誰的前面執行
		// animatorSet.play(scaleXAnimator).with(scaleYAnimator)
		// .with(translationXAnimator);
		// // animatorSet.play(scaleXAnimator).with(scaleYAnimator);
		// // animatorSet.play(scaleXAnimator).after(translationXAnimator);
		// animatorSet.start();

		// 第七個案例---使用xml檔案配置動畫
//		Animator loadAnimator = AnimatorInflater.loadAnimator(this,
//				R.animator.animator_set_x_and_y);
//		loadAnimator.setTarget(imageView);
//		loadAnimator.start();

	}

	class DreamPoint {
		private boolean bool;
	}
}

res\animator\animator_set_x_and_y.xml

<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <objectAnimator
        android:duration="2000"
        android:propertyName="scaleX"
        android:valueFrom="0.0"
        android:valueTo="1.0"
        android:valueType="floatType" />
    
    <objectAnimator
        android:duration="2000"
        android:propertyName="scaleY"
        android:valueFrom="0.0"
        android:valueTo="1.0"
        android:valueType="floatType" />

</set>



整理自教程

相關文章