android动画的学习体会
2017-08-29 02:32
197 查看
在这之前,对于动画这块只是掌握了比较简单基础的补间动画和帧动画,对于属性动画这一块,只是听说有这么一个东西,可以说几天前完全还是个小白。这几天偶然在郭霖大神的博客(http://my.csdn.net/sinyu890807)里看到了熟悉动画的详细讲解,然后细细地读了一遍,写得真的很不错,分上中下三篇博文,描述清晰,要点到位,更关键的是三篇博文逐层递进,学习起来特别轻松,感觉到学习是件多么快乐的事情。
首先明白了属性动画的几个优势,1,动画执行完毕后,所有的控件都保持最后一刻的状态,而补间动画就只是一个效果,运行完毕还是回到运行前的状态。2,属性动画在移动的过程中,同样可以做相应的操作,比如点击事件,而相比补间动画的同样的点击效果,不会随着控件的位置改变而改变,相反只会保持在原来的位置。3,属性动画可以满足不同的要求,适用于更加广泛的范围
关于属性动画,首先要掌握这几个知识点,ValueAnimator,ObjectAnimator,AnimatorSet,以及TypeEvaluator这三个类,首先说说ValueAnimator,控制的是一个值的改变,用法:
这个是个核心类,可以通过addUpdateListener这个方法去查看值的改变情况;但更加常用的却是ObjectAnimator这个类,这个类扩展于ValueAnimator这个类,这个类可以作用于任何对象,现在有一个需求,让一个圆的运动轨迹也为圆圈,用属性动画就相对比较简单,先实现一个点的圆圈运动轨迹:
其次在以这个点为圆心,画出你想要的圆圈,自定义绘制圆圈非常简单,不再赘述,仅仅粘一下关于动画部分代码:
这样就实现了绘制圆形控件运动轨迹也为圆圈。AnimatorSet这个类主要是用于将多个动画效果整合到一个控件上,用法如下:
关于AnimatorSet添加动画的方法常用的就四个,play(),with(),before(),after()。四个方法都需要放入的参数是动画对象,paly作为播放动画,with方法表示与paly一并执行,before表示的是play里面的动画效果先于before执行,待执行完成之后执行before之中的内容,而after方法则要优先于play方法先执行,执行完毕之后再执行play中的方法。以上就是最基础的属性动画用法。
其次讲解一下关于动画的运动速度的问题,如何控制一个动画的运动速度的改变,需要使用到setInterpolator()这个方法,用法:
方法里面放的参数是TimeInterpolator的接口对象,其实系统有很多实现好了的接口对象,如:AccelarateDecelerateInterpolaor(先加速,后减速),BounceInterlapotor(带回弹效果),等;有时候可能我们需要自己去实现一些系统没有包含的,下面是实现的方法:实现TimeInterpolator接口,接口中仅有一个getInterpolation抽象方法,返回值即为TypeEvaluator中的evaluate方法里面的fraction参数,从0--1的渐变值。
最后为了让用户方便,也为了更加符合面向对象的设计风格,在android3.1设计出了ViewPropertyAnimator这个类,专门为控件而设计,用法比基础篇的还要简单易懂,直接粘代码,不做过多的说明:
animate()方法返回的就是ViewPropertyAnimator的对象,后面一次跟动画,可以跟多个动画,所有动画是一起执行,没有分先后顺序。
首先明白了属性动画的几个优势,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的对象,后面一次跟动画,可以跟多个动画,所有动画是一起执行,没有分先后顺序。
相关文章推荐
- Android学习03自定义动画的播放
- android学习——android Animation 动画效果
- android动画学习笔记
- 关于 android Tween动画 和 frame动画的简单学习
- Android动画学习笔记
- Android动画学习
- 我学习android的一点小体会
- android 4.0动画学习
- 《Ophone应用开发权威指南》学习:Android 图形用户界面 之 动画(一)
- Android Graphics 学习(1)----播放gif动画简单的实现
- android 之动画的深入学习
- 学习android的一点体会
- Android Animation学习笔记 Posted on 2010-01-11 23:00 feisky 阅读(40227) 评论(12) 编辑 收藏 关于动画的实现,Android提供了A
- Android学习--Animotions动画(一)
- Android中的动画效果学习之---Tween动画(硬编码方法创建)
- Android学习指南之二十四:Android动画的实现 上
- Android游戏开发学习笔记(一):tweened animation自定义动画的实现
- Android中动画学习
- 学习android 中的 handler的体会(1)
- Android中的动画效果学习之二---Tween动画(使用XML文件进行配置动画效果)