android关于属性动画的七个使用案例

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>



整理自教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值