Android ValueAnimator和ObjectAnimator的高级用法(代码实现)

本文主要是介绍Android ValueAnimator和ObjectAnimator的高级用法(代码实现),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考文章:http://blog.csdn.net/guolin_blog/article/details/43816093

一、ValueAnimator的高级用法

1.MainActivity.java

public class MainActivity extends  Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//两个Point对象,现在需要将Point1通过动画平滑过度到Point2Point point1 = new Point(0, 0);  Point point2 = new Point(300, 300);  ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), point1, point2);  anim.setDuration(5000);  anim.start();  }}

2.MyAnimView.java

public class MyAnimView extends View {  public static final float RADIUS = 50f;  private Point currentPoint;  private Paint mPaint;  public MyAnimView(Context context, AttributeSet attrs) {  super(context, attrs);  mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);  mPaint.setColor(Color.BLUE);  }  @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.drawCircle(x, y, RADIUS, mPaint);  }  private void startAnimation() {  Point startPoint = new Point(RADIUS, RADIUS);  Point endPoint = new Point(getWidth() - RADIUS, getHeight() - RADIUS);  ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), startPoint, endPoint);  anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  @Override  public void onAnimationUpdate(ValueAnimator animation) {  currentPoint = (Point) animation.getAnimatedValue();  invalidate();  }  });  anim.setDuration(5000);  anim.start();  }  } 

3.Point.java

public class Point {  private float x;  private float y;  public Point(float x, float y) {  this.x = x;  this.y = y;  }  public float getX() {  return x;  }  public float getY() {  return y;  }  
}  

4.PointEvaluator.java

public class PointEvaluator implements TypeEvaluator{  @Override  public Object evaluate(float fraction, Object startValue, Object endValue) {  Point startPoint = (Point) startValue;  Point endPoint = (Point) endValue;  float x = startPoint.getX() + fraction * (endPoint.getX() - startPoint.getX());  float y = startPoint.getY() + fraction * (endPoint.getY() - startPoint.getY());  Point point = new Point(x, y);  return point;  }  }  

5.布局文件:activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="match_parent"  >  <com.th.animationtest2.MyAnimView  android:layout_width="match_parent"  android:layout_height="match_parent" />  </RelativeLayout>  


二、ObjectAnimator的高级用法

1.MainActivity.java

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//两个Point对象,现在需要将Point1通过动画平滑过度到Point2Point point1 = new Point(0, 0);  Point point2 = new Point(300, 300);  ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), point1, point2);  anim.setDuration(5000);  anim.start();  }}

2.Point.java

public class Point {  private float x;  private float y;  public Point(float x, float y) {  this.x = x;  this.y = y;  }  public float getX() {  return x;  }  public float getY() {  return y;  }  
}  

3.MyAnimView.java

import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;public class MyAnimView extends View {  public static final float RADIUS = 50f;  private Point currentPoint;  private Paint mPaint;  public MyAnimView(Context context, AttributeSet attrs) {  super(context, attrs);  mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);  mPaint.setColor(Color.BLUE);  }  @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.drawCircle(x, y, RADIUS, mPaint);  }  /*private void startAnimation() {  Point startPoint = new Point(RADIUS, RADIUS);  Point endPoint = new Point(getWidth() - RADIUS, getHeight() - RADIUS);  ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), startPoint, endPoint);  anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  @Override  public void onAnimationUpdate(ValueAnimator animation) {  currentPoint = (Point) animation.getAnimatedValue();  invalidate();  }  });  anim.setDuration(5000);  anim.start();  }  */private void startAnimation() {  Point startPoint = new Point(RADIUS, RADIUS);  Point endPoint = new Point(getWidth() - RADIUS, getHeight() - RADIUS);  ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), startPoint, endPoint);  anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  @Override  public void onAnimationUpdate(ValueAnimator animation) {  currentPoint = (Point) animation.getAnimatedValue();  invalidate();  }  });  //从蓝色到红色的动画过度,历时5秒ObjectAnimator anim2 = ObjectAnimator.ofObject(this, "color", new ColorEvaluator(),   "#0000FF", "#FF0000");  AnimatorSet animSet = new AnimatorSet();  animSet.play(anim).with(anim2);  animSet.setDuration(5000);  animSet.start();  }  private String color;  public String getColor() {  return color;  }  public void setColor(String color) {  this.color = color;  mPaint.setColor(Color.parseColor(color));  invalidate();  }  
}  

4.PointEvaluator.java

public class PointEvaluator implements TypeEvaluator{  @Override  public Object evaluate(float fraction, Object startValue, Object endValue) {  Point startPoint = (Point) startValue;  Point endPoint = (Point) endValue;  float x = startPoint.getX() + fraction * (endPoint.getX() - startPoint.getX());  float y = startPoint.getY() + fraction * (endPoint.getY() - startPoint.getY());  Point point = new Point(x, y);  return point;  }  }  

5.ColorEvaluator.java

public class ColorEvaluator implements TypeEvaluator {  private int mCurrentRed = -1;  private int mCurrentGreen = -1;  private int mCurrentBlue = -1;  @Override  public Object evaluate(float fraction, Object startValue, Object endValue) {  String startColor = (String) startValue;  String endColor = (String) endValue;  int startRed = Integer.parseInt(startColor.substring(1, 3), 16);  int startGreen = Integer.parseInt(startColor.substring(3, 5), 16);  int startBlue = Integer.parseInt(startColor.substring(5, 7), 16);  int endRed = Integer.parseInt(endColor.substring(1, 3), 16);  int endGreen = Integer.parseInt(endColor.substring(3, 5), 16);  int endBlue = Integer.parseInt(endColor.substring(5, 7), 16);  // 初始化颜色的值  if (mCurrentRed == -1) {  mCurrentRed = startRed;  }  if (mCurrentGreen == -1) {  mCurrentGreen = startGreen;  }  if (mCurrentBlue == -1) {  mCurrentBlue = startBlue;  }  // 计算初始颜色和结束颜色之间的差值  int redDiff = Math.abs(startRed - endRed);  int greenDiff = Math.abs(startGreen - endGreen);  int blueDiff = Math.abs(startBlue - endBlue);  int colorDiff = redDiff + greenDiff + blueDiff;  if (mCurrentRed != endRed) {  mCurrentRed = getCurrentColor(startRed, endRed, colorDiff, 0,  fraction);  } else if (mCurrentGreen != endGreen) {  mCurrentGreen = getCurrentColor(startGreen, endGreen, colorDiff,  redDiff, fraction);  } else if (mCurrentBlue != endBlue) {  mCurrentBlue = getCurrentColor(startBlue, endBlue, colorDiff,  redDiff + greenDiff, fraction);  }  // 将计算出的当前颜色的值组装返回  String currentColor = "#" + getHexString(mCurrentRed)  + getHexString(mCurrentGreen) + getHexString(mCurrentBlue);  return currentColor;  }  /** * 根据fraction值来计算当前的颜色。 */  private int getCurrentColor(int startColor, int endColor, int colorDiff,  int offset, float fraction) {  int currentColor;  if (startColor > endColor) {  currentColor = (int) (startColor - (fraction * colorDiff - offset));  if (currentColor < endColor) {  currentColor = endColor;  }  } else {  currentColor = (int) (startColor + (fraction * colorDiff - offset));  if (currentColor > endColor) {  currentColor = endColor;  }  }  return currentColor;  }  /** * 将10进制颜色值转换成16进制。 */  private String getHexString(int value) {  String hexString = Integer.toHexString(value);  if (hexString.length() == 1) {  hexString = "0" + hexString;  }  return hexString;  }  }  

6.布局文件:activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="match_parent"  >  <com.th.objectanimatortest.MyAnimView  android:layout_width="match_parent"  android:layout_height="match_parent" />  </RelativeLayout>  


这篇关于Android ValueAnimator和ObjectAnimator的高级用法(代码实现)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/805903

相关文章

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的