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

android动画的学习体会

2017-08-29 02:32 197 查看
在这之前,对于动画这块只是掌握了比较简单基础的补间动画和帧动画,对于属性动画这一块,只是听说有这么一个东西,可以说几天前完全还是个小白。这几天偶然在郭霖大神的博客(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的对象,后面一次跟动画,可以跟多个动画,所有动画是一起执行,没有分先后顺序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: