ObjectAnimator的使用:
<pre name="code" class="java">ObjectAnimator a = ObjectAnimator.ofFloat(mImageView, "Y", 0.0F, 360.0F, 0.0f).setDuration(5000); a.setInterpolator(new BounceInterpolator()); a.start();
a.setInterpolator(new BounceInterpolator());是添加的弹性效果。
ValueAnimator 的使用:
ValueAnimator valueAnimator = new ValueAnimator(); valueAnimator.setDuration(3000); valueAnimator.setInterpolator(new LinearInterpolator());//添加线性变化率 valueAnimator.setObjectValues(new PointF(0, 0));//添加返回的objiect类型,可以自定义 valueAnimator.setEvaluator(new TypeEvaluator<PointF>() { @Override public PointF evaluate(float arg0, PointF arg1, PointF arg2) { // TODO Auto-generated method stub PointF pointF = new PointF(); pointF.x = 900 * arg0; pointF.y = 1000 * 1 / 2 * 9.8f * arg0 * arg0; return pointF; } }); valueAnimator.start(); valueAnimator.addUpdateListener(new AnimatorUpdateListener() {//这里通过监听获取动画返回obeject的值来对view进行处理,实现了动画的效果 @Override public void onAnimationUpdate(ValueAnimator arg0) { // TODO Auto-generated method stub PointF pointF = (PointF) arg0.getAnimatedValue(); mImageView.setX(pointF.x); mImageView.setY(pointF.y); } });
AnimatorSet 实现多个动画同时使用的效果:
ObjectAnimator a = ObjectAnimator.ofFloat(mImageView, "Y", 0.0F, 360.0F, 0.0f).setDuration(5000); ObjectAnimator a1 = ObjectAnimator.ofFloat(mImageView, "X", 0.0F, 100.0F, 200.0f).setDuration(5000); a.setInterpolator(new BounceInterpolator()); a1.setInterpolator(new BounceInterpolator()); AnimatorSet set=new AnimatorSet(); set.play(a); set.play(a1); set.start();
LayoutTransition 这个是对viewgroup添加与移除view时添加动画:
<pre name="code" class="java">LayoutTransition transition = new LayoutTransition(); transition.setAnimator(LayoutTransition.APPEARING,transition.getAnimator(LayoutTransition.APPEARING)); layout.setLayoutTransition(transition); Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub addbt(); }); private void addbt() { // TODO Auto-generated method stub Button button = new Button(this); button.setText("test"); layout.addView(button); }
LayoutTransition.APPEARING View在ViewGroup中出现时,对这个view设置的动画
LayoutTransition.CHANGE_APPEARING View在ViewGroup中出现时,对其他受到影响的viwe设置的动画
重点看看Interpolator: 用于动画中的时间插值,其作用就是把0到1的浮点值变化映射到另一个浮点值变化。先看看AccelerateInterpolator,这个是用于加速的,动画一开始是慢,后面慢慢加快;
ObjectAnimator a = ObjectAnimator.ofFloat(mImageView, "Y", 0.0F, 360.0F, 0.0f).setDuration(5000); a.setInterpolator(new AccelerateInterpolator()); a.start(); a.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator arg0) { // TODO float c = (float) arg0.getAnimatedValue(); Log.i("=============", c + ""); mImageView.setAlpha(c); mImageView.setTranslationX(c); mImageView.setTranslationY(c); } });
我们看打印出来的日志就可以看到0开头的个数>1开头的个数>2开头的个数>3开头的个数。。。
打印的时候,每个时间间隔是相同的,那么在相同的距离内,开始时走完这个距离的时间要比以后走完这个距离要花的
时间长,从他打印了更多的点数可以看得出,发过来看,就是在相同的时间内它走的路程更短了,说明速度慢,后面走到路程
更长了,说明速度快,就形成了一个加速的过程。
正如这个图显示的那样,x轴的是时间,y轴的是距离,开始第一个距离内,打印了十个点,就是走了十个时间,第二个距离内打印了5个点,走了五个时间
第三个距离走了三个时间,第四个距离走了两个时间,明显看到了一个加速的过程。
看一下AccelerateInterpolator的源码的核心代码:
public float getInterpolation(float input) { if (mFactor == 1.0f) { return input * input; } else { return (float)Math.pow(input, mDoubleFactor);
}
可以看到返回的值是输入的平方,而Interpolator:
用于动画中的时间插值,其作用就是把0到1的浮点值变化映射到另一个浮点值变化。那么就明白了,在一个时间间隔内,本来返回的数值是a,现在返回的是a的平方,数值变小了,当增加到相同间隔的值时,需要花更多的时间了,随着a变大,当增加到相同间隔的值时,花的时间会逐渐变少,因为a变大了,这是我的理解。