您的位置:首页 > 移动开发 > Android开发

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

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

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

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

  首先是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();



完了,大概就这样吧,第一次写博客,有不对的地方请大家多多指正,谢谢!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 动画 实例