布局文件只有一张图片,此处省略;
本篇文章是监听动画的执行。
package com.example.propertyOfGang;
import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
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;
/**
* @author acer
*第六个案例
图片执行完抛物线效果后在执行缩放操作,注意缩放与抛物线不是同时执行
*/
@SuppressLint("NewApi")
// 新的API,支持的最低版本是11
public class MainActivity extends Activity implements OnClickListener {
private ImageView iv_zhangxin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_zhangxin = (ImageView) findViewById(R.id.imageView1);
iv_zhangxin.setOnClickListener(this);
// 可以在这里查看有什么属性
// iv_zhangxin.setRotationX(rotationX);
// iv_zhangxin.setAlpha(alpha);
// iv_zhangxin.setTranslationX(translationX);
}
@Override
public void onClick(View v) {
final int duration=3000;//t为三秒,代表总时间,总时间没必要改变
//3)ValueAnimator的作用是用来计算属性的,同时监听动画的执行过程,让我们自己来实现具体功能。
ValueAnimator valueAnimator=new ValueAnimator();
valueAnimator.setDuration(duration);//时间
//1)给估值器设置一个默认的中心点对象,当估值器运行的时候,它会把每一个坐标的点(x,y)估值到
//PointF上。
valueAnimator.setObjectValues(new PointF(0,0));
//2)估值器返回的是当前的某个点,某个点的坐标,添加估值器就是为了计算每一个点的。
//点的坐标要自己计算。自己计算抛物线的轨迹,自己计算每个点的(x,)坐标。
//3)估值器:用来计算我们的view在屏幕中显示的位置(运动的轨迹:平移、缩放、抛物线等等)。
valueAnimator.setEvaluator(new TypeEvaluator<PointF>() {
//泛型,放数据对象,对象要有意义,对象可以使int,double,或者自己定义的类
@Override
public PointF evaluate(float fraction, PointF startValue,
PointF endValue) {
//4.1)计算x
//1>创建一个点,抛物线是由无数个点组成的,需要计算每个点的坐标
PointF pointF=new PointF();
//2>fraction表示百分比,代表当前执行到了什么程度。
//百分比是怎么计算的呢?fraction=t/duration
//3>t表示当前时间,当前时间是什么呢?比如我运行到一秒,运行到两秒
//时间:t=fraction*duration
//4>pointF.x表示距离
//x=t*s()
//5>速度我们自己定义,自己定义为s=100px/s;
float t=fraction*3;//计算当前时间,不能写成fraction*duration,因为duration在这里表示为3000秒
pointF.x= 100*t ; //计算当前执行的距离
//4.2)计算Y
//1> y=0.5*g*t^2(g为重力加速度)
//重力加速度不够,增加十倍
pointF.y=0.5f*98f*t*t;//0.5f不能写成1/2,因为1/2的结果为0
return pointF;
}
});
//执行动画效果
valueAnimator.start();
//使用估值器计算完抛物线轨迹,计算出每个点的轨迹后,添加位置的监听
//让视图走起来,更新每个点,更新View的坐标
valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
PointF pointF=(PointF) animation.getAnimatedValue();
iv_zhangxin.setX(pointF.x);
iv_zhangxin.setY(pointF.y);
}
});
//照片旋转,投篮游戏就是这么做成的。
//旋转动画
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(iv_zhangxin, "rotationY", 0.0f,360.f)
.setDuration(2000);
objectAnimator.start();
//1)执行缩放操作
//1>添加动画的执行监听
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) {
// TODO Auto-generated method stub
ObjectAnimator.ofFloat("iv_zhangxin", "scaleX", 0.0f,1.0f).setDuration(1000).start();
}
//动画取消
@Override
public void onAnimationCancel(Animator animation) {
// TODO Auto-generated method stub
}
});
}
}