android动画的学习体会
来源:互联网 发布:淘宝店铺被释放怎么办 编辑:程序博客网 时间:2024/05/18 17:02
在这之前,对于动画这块只是掌握了比较简单基础的补间动画和帧动画,对于属性动画这一块,只是听说有这么一个东西,可以说几天前完全还是个小白。这几天偶然在郭霖大神的博客(http://my.csdn.net/sinyu890807)里看到了熟悉动画的详细讲解,然后细细地读了一遍,写得真的很不错,分上中下三篇博文,描述清晰,要点到位,更关键的是三篇博文逐层递进,学习起来特别轻松,感觉到学习是件多么快乐的事情。
首先明白了属性动画的几个优势,1,动画执行完毕后,所有的控件都保持最后一刻的状态,而补间动画就只是一个效果,运行完毕还是回到运行前的状态。2,属性动画在移动的过程中,同样可以做相应的操作,比如点击事件,而相比补间动画的同样的点击效果,不会随着控件的位置改变而改变,相反只会保持在原来的位置。3,属性动画可以满足不同的要求,适用于更加广泛的范围
关于属性动画,首先要掌握这几个知识点,ValueAnimator,ObjectAnimator,AnimatorSet,以及TypeEvaluator这三个类,首先说说ValueAnimator,控制的是一个值的改变,用法:
这个是个核心类,可以通过addUpdateListener这个方法去查看值的改变情况;但更加常用的却是ObjectAnimator这个类,这个类扩展于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();
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的对象,后面一次跟动画,可以跟多个动画,所有动画是一起执行,没有分先后顺序。
阅读全文
0 0
- android动画的学习体会
- Android Recovery模式学习体会
- .net开发者对android第二周的学习体会
- 关于_beginthread()的学习体会
- SOMA的学习体会
- C#事件的学习体会
- SPL的学习体会
- 使用tabbar的学习体会
- 2013年的学习体会
- struts2的简单学习体会
- 学习体会
- 学习体会
- 学习体会
- 学习体会
- 学习体会
- 学习体会
- 学习体会
- 学习体会
- Beginning Spring学习笔记——第4章(一)Spring JDBC连接的配置
- 为什么会觉得无聊?
- Leetcode 56. Merge Intervals
- Beginning Spring学习笔记——第4章(二)使用Spring执行数据访问操作
- Hexo的安装记录
- android动画的学习体会
- 浅谈Web渗透测试中的信息收集
- C#
- mybatis Invalid bound statement (not found)
- Confluent Platform部署
- 数位分离以及转化成k进制--Integer to Roman
- 【译】如何应对 CNN 中的过拟合问题
- prediction maschine learning
- 你没看错:Swift可以直接调用Python函数库