简介

ObjectAnimator,是ValueAnimator的子类,支持利用目标视图的属性来实现动画效果。构造ObjectAnimator的时候,将会提取对应的参数来定义动画对象和对象属性。合适的get/set方法是视图实现属性动画的内部机理,动画过程中,系统将通过get/set方法来实现效果,也就是根据一定的规律来为View设置属性。

Animators可以用过资源文件或者是代码定义,当使用资源文件创建的时候,若使用PropertyValuesHolder和Keyframe可以创建出更加复杂的动画,使用PropertyValuesHolder可以实现几个属性的并行变化。

使用Keyframes,可以实现更复杂的动画过程中的属性变化方式。我们可以为每一个Keyframes明确一个fractional value(因子,0-1)来决定在整个动画过程中什么时候到达这个属性值。不设置fractions的时候,这些关键帧将会均匀的分布在整个动画过程中。至于那些没有指定value值的关键帧,将会在动画开始的时候推导出他们的 value。初次之外,我们可以给关键帧添加插值器,整个插值器将会在被设置的这一帧和前一帧动画之间。对于没有设置插值器的关键帧,将会给他们提供一个默认的插值器AccelerateDecelerateInterpolator

XML实现

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:repeatCount="1"
android:repeatMode="reverse">
<!-- BEGIN_INCLUDE(KeyframeResources) -->
<propertyValuesHolder android:propertyName="x">
<keyframe
android:fraction="0"
android:value="800" />
<keyframe
android:fraction=".2"
android:interpolator="@android:anim/accelerate_interpolator"
android:value="1000" />
<keyframe
android:fraction="1"
android:interpolator="@android:anim/accelerate_interpolator"
android:value="400" />
</propertyValuesHolder>
<propertyValuesHolder android:propertyName="y">
<keyframe />
<keyframe
android:fraction=".2"
android:interpolator="@android:anim/accelerate_interpolator"
android:value="300" />
<keyframe
android:interpolator="@android:anim/accelerate_interpolator"
android:value="1000" />
</propertyValuesHolder>
<!-- END_INCLUDE(KeyframeResources) -->
</objectAnimator>
objectAnimator属性值 含义
android:propertyName 属性名称
android:valueTo 动画结束时属性的值
android:valueFrom 动画开始时属性的值
android:duration 动画时长
android:startOffset 动画延迟几秒播放,调用start()方法后延迟
android:repeatCount 动画重复次数
android:repeatMode 动画重复的方式,restart/reverse
android:valueType 属性值类型,intType,floatType,colorType,pathType

propertyValuesHolder属性值和objectAnimator基本相同

keyframe属性值 含义
android:fraction 插值因子
android:interpolator 插值器,用在当前帧和前一帧之间
android:value 需要设置的属性值

代码实现

public class MainActivity extends AppCompatActivity {

    private int width;
private int height;
private ImageView imageView = null;
private ImageView loveImageView = null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setNavigationIcon(R.drawable.left);
setSupportActionBar(toolbar);//设置ActionBar getWidthAndHeight();//获取屏幕大小
imageView = (ImageView) findViewById(R.id.ball);
loveImageView = (ImageView) findViewById(R.id.love);
} /*
心跳
*/
public void doAnimation(final View view) {
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f,
0.8f, 1f, 0.8f, 1.0f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX", 0.6f,
0.8f, 1f, 0.8f, 1.0f);
PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("scaleY", 0.6f,
0.8f, 1f, 0.8f, 1.0f);
ObjectAnimator.ofPropertyValuesHolder(loveImageView, pvhX, pvhY, pvhZ).setDuration(1000).start();//创建属性动画并开始
} /*
抛物线
*/
public void doGtAnimation(final View view) {
ObjectAnimator anim = ObjectAnimator.ofFloat(imageView, "yidong", 0, 1, 0).setDuration(3000);
/*设置动画更新监听器,通过手动设置属性来实现view属性的改变达到动画的效果*/
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float cVal = (Float) animation.getAnimatedValue();
imageView.setX(5 * cVal * 100);
imageView.setY(5 * cVal * 3 * cVal * 3 * 100);
}
});
/*设置动画过程监听器,监听开始结束取消等动作*/
anim.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
System.err.println("yidong -- onAnimationStart");
} @Override
public void onAnimationEnd(Animator animation) {
System.err.println("yidong -- onAnimationEnd");
} @Override
public void onAnimationCancel(Animator animation) {
System.err.println("yidong -- onAnimationCancel");
} @Override
public void onAnimationRepeat(Animator animation) {
System.err.println("yidong -- onAnimationRepeat");
}
});
/*重复魔石*/
anim.setRepeatMode(ValueAnimator.RESTART);
/*重复次数*/
anim.setRepeatCount(2);
anim.start(); } /*
转圈圈
*/
public void doCircleAnimation(View view) {
ObjectAnimator anim = ObjectAnimator.ofFloat(imageView, "yidong", 0, 2 * (float) Math.PI).setDuration(1000);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
System.err.println("yidong -- value = " + animation.getAnimatedValue());
float cVal = (Float) animation.getAnimatedValue();
imageView.setX((float) Math.sin(cVal) * 200 + width / 2);
imageView.setY((float) Math.cos(cVal) * 200 + height / 2);
}
});
anim.setRepeatMode(ValueAnimator.REVERSE);
anim.setRepeatCount(-1);//无限重复
anim.start();
} /*
从xml文件中提取动画
*/
public void doXmlAnimation(View view) {
Animator animator = AnimatorInflater.loadAnimator(this, R.animator.one);//从xml文件中添加动画
animator.setTarget(loveImageView);
animator.start();
} /*
获取屏幕的宽高
*/
private void getWidthAndHeight() {
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
width = dm.widthPixels;
height = dm.heightPixels;
System.err.println("yidong -- width = " + width);
System.err.println("yidong -- height = " + height);
}
}

实际效果


写在最后

属性动画的内容很丰富,这里只是提到了ObjectAnimator的一些简单实现,很深入和全面的东西,需要自己看源码,熟悉对应的API

<Android 基础(三十一)> ObjectAnimator的更多相关文章

  1. Bootstrap <基础三十一>插件概览

    在前面布局组件中所讨论到的组件仅仅是个开始.Bootstrap 自带 12 种 jQuery 插件,扩展了功能,可以给站点添加更多的互动.即使不是一名高级的 JavaScript 开发人员,也可以着手 ...

  2. <Android基础>(三) UI开发 Part 3 RecyclerView

    RecyclerView 1)RecyclerView的基本用法 2)横向滚动和瀑布流滚动 3)注册点击事件 3.6 强大的滚动控件 RecyclerView ListView缺点: 1.不使用技巧优 ...

  3. <Android基础>(三) UI开发 Part 2 ListView

    ListView 1)ListView的简单用法 2)定制ListView界面 3)提升ListView的运行效率 4)ListView的点击事件 3.5 ListView 3.5.1 ListVie ...

  4. <Android 基础(十一)> Snackbar

    介绍 Snackbars provide lightweight feedback about an operation. They show a brief message at the botto ...

  5. <Android基础>(三) UI开发 Part 1

    1.常用控件 1)TextView 2)Button 3)EditText 4)ImageView 5)ProgressBar 6)AlertDialog 7)ProgressDialog 2.四种布 ...

  6. Bootstrap <基础三十二>模态框(Modal)插件

    模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. 如果您想要单独引用该插件的功能,那么您需要引用  ...

  7. Bootstrap <基础三十>Well

    Well 是一种会引起内容凹陷显示或插图效果的容器 <div>.为了创建 Well,只需要简单地把内容放在带有 class .well 的 <div> 中即可.下面的实例演示了 ...

  8. Bootstrap <基础二十一>徽章(Badges)

    Bootstrap 徽章(Badges).徽章与标签相似,主要的区别在于徽章的边角更加圆滑. 徽章(Badges)主要用于突出显示新的或未读的项.如需使用徽章,只需要把 <span class= ...

  9. Bootstrap<基础三> 排版

    Bootstrap 使用 Helvetica Neue. Helvetica. Arial 和 sans-serif 作为其默认的字体栈. 使用 Bootstrap 的排版特性,您可以创建标题.段落. ...

  10. Android基础夯实--重温动画(五)之属性动画 ObjectAnimator详解

    只有一种真正的英雄主义 一.摘要 ObjectAnimator是ValueAnimator的子类,它和ValueAnimator一样,同样具有计算属性值的功能,但对比ValueAnimator,它会更 ...

随机推荐

  1. [Leetcode]120.三角形路径最小和

    ---恢复内容开始--- 题目的链接 简单的动态规划题,使用了二维dp数组就能很好的表示. 由于有边界的问题,所以这个dp数组为 dp[n+1][n+1]. dp[i][j]意思是终点为(i-1,j- ...

  2. 课程一(Neural Networks and Deep Learning),第二周(Basics of Neural Network programming)—— 4、Logistic Regression with a Neural Network mindset

    Logistic Regression with a Neural Network mindset Welcome to the first (required) programming exerci ...

  3. C# 多线程学习系列二

    一.关于前台线程和后台线程 1.简介 CLR中线程分为两种类型,一种是前台线程.另一种是后台线程. 前台线程:应用程序的主线程.Thread构造的线程都默认为前台线程 后台线程:线程池线程都为后台线程 ...

  4. Shell 相互调用

    Shell 文件包含 和其他语言一样,Shell 也可以包含外部脚本.这样可以很方便的封装一些公用的代码作为一个独立的文件. Shell 文件包含的语法格式如下: . filename # 注意点号( ...

  5. spring-如何将spring源码成功导入Eclipse中

    一.从 github上下载Spring源码到本机 二.利用 Gradle 编译 Spring 源码 环境: - Spring源码版本:spring-framework-4.3.x - Gradle版本 ...

  6. linux使用find和crontab命令定期清理过期文件

    crontab 命令 crontab 命令是 Linux 中用来设定重复执行命令或脚本的工具.它能够在指定的时间段内,按照需求以某一时间间隔执行命令或脚本. crontab 的基本用法 crontab ...

  7. 散列算法-MD5

    信息摘要技术把明文内容按某种规则生成一段哈西值,即使明文消息只改动了一点点,生成的结果也会完全不同. MD5(Message-digest algorithm 5)就是信息摘要的一种实现,它可以从任意 ...

  8. linux下tar gz bz2 tgz z等众多压缩文件的压缩与解压方法

    Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的.生成tar包后,就可以用其它的程序来进 行压缩了,所以首先就来讲讲ta ...

  9. SHA-1退休:数千万用户通向加密网站之路被阻

    ​ Facebook和Cloudflare警告道:上千万用户将无法访问只使用SHA-2签名证书的HTTPS网站.2016年-2017年是SHA-1算法的缓冲期.2017年开始CA机构将不能颁发含有sh ...

  10. [C#]记一次解析XML转对象的笔记

    项目中调用第三方API,返回格式是XML字符串,需要将XML反序列化为对象,格式如下: <?xml version="1.0"?> <Response xmlns ...