楼主前段时间做一个android项目,其中一个需求是需要制作一个动画,但是之前楼主没接触过android动画,所以在网上搜了下,并且也有人推荐可以试下用属性动画,所以我就百度了下属性动画怎么用,并顺便写下valueAnimator的用法。

  其实valueAnimator用起来非常非常简单:

    首先先讲下核心函数:

    

        ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(Math.min(((getRight()-getLeft()))/2,(getBottom()-getTop())/2)), startPoint, endPoint);

        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
currentPoint = (Point) animation.getAnimatedValue();
invalidate();
}
});
anim.setRepeatMode(ValueAnimator.RESTART);
anim.setRepeatCount(1000); anim.start();

    首先对这几行代码进行一个简单的解释,第一行为初始化一个valueAnimator类,然后其中第一个参数是一个事先定以后好的类,这个在后边具体解释,,然后第二个第三个参数分别代表起始位置和结束位置,当然这个也可以不写,通过其他方式也可传入进去,这个也放在后边解释。

    第二行代码,是用来添加监听器,这个监听器作用则是实时的获取当前坐标,赋值给currentPoint(这个对象是自己声明的,这个对象可以在全局中声明和使用)。

    然后invalidate()则是更新当前图形坐标。

    setRepeatMode(),则是选择动画执行的模式,有两种模式,即ValueAnimator.RESTART(重复),ValueAnimator.REVERSE(反方向重复)

    anim.setRepeatCount(1000)设置重复次数。

    anim.setDuration(40000);设置每次执行时间。

    那这个说完了,则把刚才的遗留问题解决了,下边贴出那个类的代码

    

public class PointEvaluator implements TypeEvaluator {
float r;
public PointEvaluator(float r)
{
this.r = r;
} @Override
public Object evaluate(float fraction, Object startValue, Object endValue) {
Point startPoint = (Point) startValue;
Point endPoint = (Point) endValue;
float x = new Float(startPoint.getX() - Math.sin(fraction* Math.PI*2*20)*r);
float y = new Float(startPoint.getY() - (r - Math.cos(fraction* Math.PI*2*20) * r) );
Point point = new Point(x, y);
return point;
} }

    这个类中,最重要的是evaluate函数,这个函数的作用是计算动画的过程,其中fraction参数的值是从0-1,然后动画执行一次,fraction从0到1执行一次。因此,在这个函数中,通过fraction函数来计算当前的坐标,因此要利用好这个fraction参数。这里的两个参数startValue和endValue则是刚才上述讲的传入的两个参数,为什么说可传可不传,是因为你也可以通过对这个类添加构造函数,然后传进来初始和结束值。

    然后这个类怎么用呢?

    看下方代码:

    

public class MyAnimView extends View {

    public static final float RADIUS = 10f;

    private Point currentPoint;

    private Paint mPaint;

    public MyAnimView(Context context, AttributeSet attrs) {

        super(context, attrs);
Log.e("view","-------------构造函数");
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(Color.GREEN);
mPaint.setStrokeWidth(5l);
} @Override
protected void onDraw(Canvas canvas) {
if (currentPoint == null) {
currentPoint = new Point(RADIUS, RADIUS);
drawCircle(canvas);
startAnimation();
} else {
drawCircle(canvas);
}
} private void drawCircle(Canvas canvas) {
float x = currentPoint.getX();
float y = currentPoint.getY();
canvas.drawLine((getLeft()+getRight())/2, (getBottom()+getTop())/2,x,y,mPaint);
} public void startAnimation() { Point startPoint = new Point((getLeft()+getRight())/2, (getBottom()+getTop())/2+ Math.min(((getRight()-getLeft()))/2,(getBottom()-getTop())/2));
Point endPoint = startPoint;
Log.e("myAnim","x="+(getLeft()+getRight())/2+" y="+(getTop()+getBottom())/2);
Log.e("myAnim","left="+getLeft()+" right="+getRight()+" top="+getTop()+" botton"+getBottom()); ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(Math.min(((getRight()-getLeft()))/2,(getBottom()-getTop())/2)), startPoint, endPoint); anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
currentPoint = (Point) animation.getAnimatedValue();
invalidate();
}
});
anim.setRepeatMode(ValueAnimator.RESTART);
anim.setRepeatCount(1000);
anim.setDuration(4000);
anim.start();
} }

    通过自定义view,然后在其中ondraw中做开始动画,然后画出具体的图形,则大功告成。

    

android属性动画之ValueAnimator的更多相关文章

  1. Android属性动画之ValueAnimator的介绍

    之前两篇博客,介绍的是ObjectAnimator作用与某一个控件的某一个属性.但我们的ValueAnimator它本身并不会作用与任何一个属性,它本身也不会提供任何一种动画.它简单的来说,就是一个数 ...

  2. 详解Android属性动画

    前面我们讲到的属性动画都是使用代码的定义方式:Android属性动画之ValueAnimator和Android属性动画之ObjectAnimator和AnimatorSet,下面我们再来看看使用XM ...

  3. Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/43536355 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法 ...

  4. 【转】android 属性动画之 ObjectAnimator

    原文网址:http://blog.csdn.net/feiduclear_up/article/details/39255083 前面一篇博客讲解了 android 简单动画之 animtion,这里 ...

  5. Android属性动画之ValueAnimation

    ValueAnimation是ObjectAnimation类的父类,经过前几天的介绍,相信大家对ObjectAnimation有了 一定的认识,今天就为大家最后介绍一下ValueAnimation, ...

  6. Android属性动画完全解析(下)

    转载:http://blog.csdn.net/guolin_blog/article/details/44171115 大家好,欢迎继续回到Android属性动画完全解析.在上一篇文章当中我们学习了 ...

  7. Android属性动画完全解析(上),初识属性动画的基本用法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/43536355 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系 ...

  8. Android属性动画完全解析(中)

    转载:http://blog.csdn.net/guolin_blog/article/details/43536355 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是 ...

  9. Android属性动画完全解析(上)

    Android属性动画完全解析(上) 转载:http://blog.csdn.net/guolin_blog/article/details/43536355 在手机上去实现一些动画效果算是件比较炫酷 ...

随机推荐

  1. 【java JVM】JVM中类的加载,加载class文件的原理机制

    暂时贴图一张,以后补充 解释: 1.符号引用替换为直接引用[参考:http://blog.csdn.net/maerdym/article/details/8087620] 在java中,一个java ...

  2. ORA-12537:TNS:连接关闭 -------数据库最大连接数问题

    问题: 我自己用PLSQL登录实验,我也登陆不了,可是让同事实验,他一会能够登录,一会不能够登录.应用还是能够正常访问,只是PLSQL登录异常. 分析: 基于这种情况去百度,有的说是配置文件有问题,有 ...

  3. javascript(JQuery)元素操作

    html代码如下: <div id="picK"> <ul> <li style="float:left;width:90px;" ...

  4. HTMLTestRunner美化

    https://www.cnblogs.com/findyou/p/6925733.html 参考这个,美化的不错,进入了汉化,及加入了一些样式,

  5. LNMP第二部分nginx、php配置

    内容概要:一. nginx.confvim /usr/local/nginx/conf/nginx.conf //清空原来的配置,加入如下内容:user nobody nobody;worker_pr ...

  6. 小二助手(react应用框架)-http访问

    浏览地址http://118.25.217.253:4000 账号test密码123   qq讨论群:836719189 要写这个系统,就需要数据来源,让我们先来看看如果通过客户端调用服务端api拿到 ...

  7. idea Tomcat 部署 war和war exploded的区别

    idea Tomcat 部署 war和war exploded的区别 学习了:https://blog.csdn.net/linjpg/article/details/73322881 explode ...

  8. testform

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. LoadRunner测试WebService的3种方式

    LR在WebService虚拟用户协议中支持两种方式测试WebService,一种是通过“Add Service Call”的方式,一种是Import SOAP的方式. Import SOAP的方式需 ...

  10. 在eclipse导入Java 的jar包的方法 JDBC

    在使用JDBC编程时需要连接数据库,导入JAR包是必须的,导入其它的jar包方法同样如此,导入的方法是 打开eclipse 1.右击要导入jar包的项目,点properties 2.左边选择java ...