android动画的学习体会

来源:互联网 发布:淘宝店铺被释放怎么办 编辑:程序博客网 时间:2024/05/18 17:02

在这之前,对于动画这块只是掌握了比较简单基础的补间动画和帧动画,对于属性动画这一块,只是听说有这么一个东西,可以说几天前完全还是个小白。这几天偶然在郭霖大神的博客(http://my.csdn.net/sinyu890807)里看到了熟悉动画的详细讲解,然后细细地读了一遍,写得真的很不错,分上中下三篇博文,描述清晰,要点到位,更关键的是三篇博文逐层递进,学习起来特别轻松,感觉到学习是件多么快乐的事情。

首先明白了属性动画的几个优势,1,动画执行完毕后,所有的控件都保持最后一刻的状态,而补间动画就只是一个效果,运行完毕还是回到运行前的状态。2,属性动画在移动的过程中,同样可以做相应的操作,比如点击事件,而相比补间动画的同样的点击效果,不会随着控件的位置改变而改变,相反只会保持在原来的位置。3,属性动画可以满足不同的要求,适用于更加广泛的范围

关于属性动画,首先要掌握这几个知识点,ValueAnimator,ObjectAnimator,AnimatorSet,以及TypeEvaluator这三个类,首先说说ValueAnimator,控制的是一个值的改变,用法:

ValueAnimator valueAnimator=ValueAnimator.ofFloat(0f,1f);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {//valueAnimator值改变的监听方法    @Override    public void onAnimationUpdate(ValueAnimator animation) {        Log.i("valueLZD",animation.getAnimatedValue()+"");    }});valueAnimator.setDuration(2000);//完成从0--1需要的时间valueAnimator.start();
这个是个核心类,可以通过addUpdateListener这个方法去查看值的改变情况;但更加常用的却是ObjectAnimator这个类,这个类扩展于ValueAnimator这个类,这个类可以作用于任何对象,现在有一个需求,让一个圆的运动轨迹也为圆圈,用属性动画就相对比较简单,先实现一个点的圆圈运动轨迹:

package trypost.dafeng.com.studyforever.tools;import android.animation.TypeEvaluator;import android.util.Log;import trypost.dafeng.com.studyforever.entity.Point;/** * Created by asus on 2017/8/26. * 在@1处让点沿着圆的轨迹运动,在通过点的位置绘制出想要移动的View,那么这个View的运动轨迹就是圆 * 在@2处为直线运动轨迹。 */public class PointEvalutor implements TypeEvaluator {    @Override    public Object evaluate(float fraction, Object startValue, Object endValue) {        Point startPoint = (Point) startValue;        Point endPoint= (Point) endValue;        //@1圆形运动轨迹        double raidus=Math.sqrt((endPoint.getX()-startPoint.getX())*(endPoint.getX()-startPoint.getX())+                (endPoint.getY()-startPoint.getY())*(endPoint.getY()-startPoint.getY()));        float X= (float) ((startPoint.getX()+endPoint.getX())/2+Math.sin(fraction*2*Math.PI)*raidus/2);        float Y= (float) ((startPoint.getY()+endPoint.getY())/2+Math.cos(fraction*2*Math.PI)*raidus/2);        Log.i("animViews",fraction+"");        Point nowPoint=new Point(X,Y);        //@2直线运动轨迹//        Point nowPoint=new Point(startPoint.getX()+(endPoint.getX()-startPoint.getX())*fraction,startPoint.getY()+//                (endPoint.getY()-startPoint.getY())*fraction);        return nowPoint;    }}
其次在以这个点为圆心,画出你想要的圆圈,自定义绘制圆圈非常简单,不再赘述,仅仅粘一下关于动画部分代码:

ValueAnimator animator=ValueAnimator.ofObject(new PointEvalutor(),startPoint,endPoint);animator.setDuration(8000);animator.start();
这样就实现了绘制圆形控件运动轨迹也为圆圈。AnimatorSet这个类主要是用于将多个动画效果整合到一个控件上,用法如下:

AnimatorSet animatorSet=new AnimatorSet();//动画集合,将多个动画联系到一起animatorSet.setDuration(9990);animatorSet.play(animator).with(objectAnimator);animatorSet.start();
关于AnimatorSet添加动画的方法常用的就四个,play(),with(),before(),after()。四个方法都需要放入的参数是动画对象,paly作为播放动画,with方法表示与paly一并执行,before表示的是play里面的动画效果先于before执行,待执行完成之后执行before之中的内容,而after方法则要优先于play方法先执行,执行完毕之后再执行play中的方法。以上就是最基础的属性动画用法。

其次讲解一下关于动画的运动速度的问题,如何控制一个动画的运动速度的改变,需要使用到setInterpolator()这个方法,用法:

animatorSet.setInterpolator(new DecelerateAccelarateInterpolator());
方法里面放的参数是TimeInterpolator的接口对象,其实系统有很多实现好了的接口对象,如:AccelarateDecelerateInterpolaor(先加速,后减速),BounceInterlapotor(带回弹效果),等;有时候可能我们需要自己去实现一些系统没有包含的,下面是实现的方法:实现TimeInterpolator接口,接口中仅有一个getInterpolation抽象方法,返回值即为TypeEvaluator中的evaluate方法里面的fraction参数,从0--1的渐变值。

package trypost.dafeng.com.studyforever.tools;import android.animation.TimeInterpolator;/** * Created by asus on 2017/8/29. * 属性动画,控制移动速度,先减速,后加速,自定义实现 */public class DecelerateAccelarateInterpolator implements TimeInterpolator {    @Override    public float getInterpolation(float input) {        if(input<0.5)        return (float) Math.sin(input*Math.PI)/2;//减速        else            return (float) (1-Math.sin(input*Math.PI)/2);//加速    }}

最后为了让用户方便,也为了更加符合面向对象的设计风格,在android3.1设计出了ViewPropertyAnimator这个类,专门为控件而设计,用法比基础篇的还要简单易懂,直接粘代码,不做过多的说明:

startBtn.animate().x(200).y(400).setDuration(10000);
animate()方法返回的就是ViewPropertyAnimator的对象,后面一次跟动画,可以跟多个动画,所有动画是一起执行,没有分先后顺序。


原创粉丝点击