Android安卓属性动画PropertyAnimation简单使用实例

   博主在实际开发过程中第一次接触了属性动画,感觉用起来非常之爽,不像帧动画个补间动画那样好看不好用,并没有实际用途(个人感觉)

那么好,接下来进入正题。

  那么我们应该如何使用呢。

  首先是ObjectAnimator这个类,一般来说我们使用简单的动画时,比如较为单一的动画,旋转、缩放、等等可以直接用这个API

  一句话就可以使用了,超级简单

ObjectAnimator.ofFloat(view, "rotationX", 0.0F, 360.0F)

//设置持续时间
.setDuration(2000)
.start();


多属性值同时改变只使用ObjectAnimator时

ObjectAnimator objectAnim = ObjectAnimator.
ofFloat(view,"wx",1.0f,0.0f).
setDuration(2000);
objectAnim.start();

//设置动画更新监听
objectAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {

//得到动画的值
float value = (float) animation.getAnimatedValue();

//修改view的属性,即设置view的动画
view.setAlpha(value);
view.setScaleX(value);
view.setScaleY(value);
}
});


//使用ValueAnimator实现自定义动画效果
ValueAnimator valueAnim = new ValueAnimator();
valueAnim.setDuration(3000);
//初始化画笔位置
valueAnim.setObjectValues(new PointF(0,0));
//设置插值器
valueAnim.setInterpolator(new LinearInterpolator());
//自定义类型估值
valueAnim.setEvaluator(new TypeEvaluator() {
@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {
//fraction = t / duration --> t = f * d
PointF pointF = new PointF();
//设置水平速度为100pix/s
pointF.x = 100 * fraction * 5;
//设置自由落体(1/2*g*t^2)
pointF.y = 0.5f * 100 * (fraction * 5) * (fraction * 5);
//将生成出来的画笔返回
return pointF;
}
});
//在动画完成的时候可以执行删除控件等操作,比如控件隐藏之后还是要把他从那个位置移出掉
valueAnim.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
Log.e("msg","动画开始了");
}
@Override
public void onAnimationEnd(Animator animation) {
Log.e("msg","动画结束了");
ViewGroup parentView = (ViewGroup) view.getParent();
if(parentView != null){
// 动画执行完移出imageview
// parentView.removeView(view);
}
}
@Override
public void onAnimationCancel(Animator animation) {
Log.e("msg","动画退出了");
}
@Override
public void onAnimationRepeat(Animator animation) {
Log.e("msg","动画重复了");
}
});
//设置动画更新监听,每次画笔位置变化动态改变view的属性值
valueAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//动态设置imageview的实际属性
PointF pointF = (PointF) animation.getAnimatedValue();
imageView.setX(pointF.x);
imageView.setY(pointF.y);
}
});
valueAnim.start();


//如果没有Set这个类时,我们也可以单独的进行动画设置
// ObjectAnimator anim1 = ObjectAnimator.ofFloat(view,"scaleX",1.0f,0.0f);
// anim1.setDuration(2000);
// anim1.setInterpolator(new LinearInterpolator());
// ObjectAnimator anim2 = ObjectAnimator.ofFloat(view,"scaleY",1.0f,0.0f);
// anim2.setDuration(2000);
// anim2.setInterpolator(new LinearInterpolator());

//现在有了这个Set类时我们就可以用AnimatorSet类了,就不用重复设置其属性值了
ObjectAnimator anim1 = ObjectAnimator.ofFloat(view,"scaleX",1.0f,2f);
ObjectAnimator anim2 = ObjectAnimator.ofFloat(view,"scaleY",1.0f,2f);
//创建AnimatorSet类来装所有的动画,并设置好具体属性
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(2000);
animatorSet.setInterpolator(new LinearInterpolator());
//两个动画同时执行
animatorSet.playTogether(anim1,anim2);
animatorSet.start();//前两个动画


ObjectAnimator anim1 = ObjectAnimator.ofFloat(view,"scaleX",1.0f,2f);
ObjectAnimator anim2 = ObjectAnimator.ofFloat(view,"scaleY",1.0f,2f);
//后两个动画根据view的具体X值来动态设置
float viewX = view.getX();
ObjectAnimator anim3 = ObjectAnimator.ofFloat(view,"x",viewX,0.0f);
ObjectAnimator anim4 = ObjectAnimator.ofFloat(view,"x",viewX);
//创建AnimatorSet类来装所有的动画,并设置好具体属性
AnimatorSet animatorSet = new AnimatorSet();
//设置好动画播放先后顺序,1/2/3同时播放,4随后播放
animatorSet.play(anim1).with(anim2);
animatorSet.play(anim2).with(anim3);
animatorSet.play(anim4).after(anim3);
// animSet.play(anim1).with(anim2).before(anim3).before(anim5);
// 这样是不行的,系统不会根据你写的这一长串来决定先后的顺序,所以麻烦你按照上面例子的写法,多写几行
animatorSet.setDuration(2000);
animatorSet.setInterpolator(new LinearInterpolator());
animatorSet.start();


完了,大概就这样吧,第一次写博客,有不对的地方请大家多多指正,谢谢!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值