楼主前段时间做一个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架构师之路 Spring学习笔记(一) Spring介绍

    前言 这是一篇原创的Spring学习笔记.主要记录我学习Spring4.0的过程.本人有四年的Java Web开发经验,最近在面试中遇到面试官总会问一些简单但我不会的Java问题,让我觉得有必要重新审 ...

  2. SQL Server on Linux: How? Introduction: SQL Server Blog

    SQL Server Blog Official News from Microsoft’s Information Platform https://blogs.technet.microsoft. ...

  3. sql-server-on-linux-how-i-think-they-did-it : Anthony Nocentino's Blog

    http://www.sqlservercentral.com/blogs/anthony-nocentinos-blog/2016/11/21/sql-server-on-linux-how-i-t ...

  4. FSLib.Extension库

    FSLib.Extension库是一个用于.NET的扩展函数库,所提供的函数和方法均使用扩展方法引入,包含数以百计的用于日常编写程序时使用的扩展方法. http://www.fishlee.net/s ...

  5. SQLite 使用技巧

    http://blog.csdn.net/beifengdelei/article/details/7166056 SQLite自增ID自段使用方法为 INTEGER PRIMARY KEY AUTO ...

  6. SpringBoot整合Quartz定时任务

    记录一个SpringBoot 整合 Quartz 的Demo实例 POM.XML文件 <!-- 定时器任务 quartz需要导入的坐标 --> <dependency> < ...

  7. JAVA常见算法题(二十六)

    package com.xiaowu.demo; import java.util.Scanner; /** * Java实现将阿拉伯数字转为汉字 * * @author WQ * */ public ...

  8. golang之bufio包的使用

    原文地址:http://www.niu12.com/article/38 github地址:https://github.com/ZQCard/go_api_practice // 参考:https: ...

  9. final修饰符的三种使用场景

    final有三种使用场景,各自是修饰变量.方法和类.不管哪种修饰.一旦声明为final类型.你将不能改变这个引用了,编译器会检查代码,假设你试图再次初始化,编译器会报错.以下我来详细说说每一种修饰场景 ...

  10. win下写任务提交给集群

    一,复制和删除hdfs中的文件 import org.apache.hadoop.fs.{FileSystem, Path} import org.apache.spark.{SparkConf, S ...