属性动画

  • 介绍
  • 先上全部代码:
  • ObjectAnimator
  • AnimatorSet
  • ValueAnimator
  • 动画监听
  • TypeEvaluator
  • Interpolator
  • ViewPropertyAnimator

介绍

属性动画本质就是动态改变View的属性。
PS:属性动画不仅可以改变View的属性。只要是一个对象的属性,有set/get方法,就可以动态的去变化。

先上全部代码:

    private void objectAnimationFromXML() {Animator animator = AnimatorInflater.loadAnimator(this, R.animator.translationx);animator.setTarget(showView);animator.start();}private void objectAnimationFromJavaCode() {//将view的tranlationX属性,在2000ms从0变化到100ObjectAnimator.ofFloat(showView, "translationX", 0, 100).setDuration(2000).start();}private void animatorSet() {ObjectAnimator translationX = ObjectAnimator.ofFloat(showView, "translationX", 0, 100).setDuration(2000);ObjectAnimator translationY = ObjectAnimator.ofFloat(showView, "translationY", 0, 100).setDuration(2000);ObjectAnimator alpha = ObjectAnimator.ofFloat(showView, "alpha", 1.0f, 0.5f).setDuration(2000);ObjectAnimator scale = ObjectAnimator.ofFloat(showView, "scaleX", 1.0f, 0.5f).setDuration(2000);ObjectAnimator rotate = ObjectAnimator.ofFloat(showView, "rotation", 0, 180).setDuration(2000);//以下动画播放顺序,scale->(translationY,alpha)->translationXAnimatorSet set = new AnimatorSet();set.play(translationY).with(alpha).before(translationX).after(scale);//动画5在1000ms后播放。set.play(rotate).after(1000);set.setDuration(2000);set.start();}private void valueAnimator() {ValueAnimator animator = ValueAnimator.ofFloat(0, 100);animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {float value = (float) animation.getAnimatedValue();if (value < 50) {showView.setTranslationX(value);} else {showView.setTranslationY(value);}}});animator.setDuration(2000);animator.start();}private void typeEvaluator() {showView.setClipToOutline(true);Circle first = new Circle();first.setR(0);Circle end = new Circle();end.setR(showView.getHeight() / 2);ValueAnimator animator = ObjectAnimator.ofObject(new CircleEvaluator(), first, end);animator.setDuration(2000);animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {final Circle circle = (Circle) animation.getAnimatedValue();showView.setOutlineProvider(new ViewOutlineProvider() {@Overridepublic void getOutline(View view, Outline outline) {outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), circle.getR());}});}});animator.start();}private void interpolator() {ObjectAnimator translationX =ObjectAnimator.ofFloat(showView, "translationX", 0, 500).setDuration(2000);translationX.setInterpolator(new ReverseInterpolator());translationX.start();}private void viewPropertyAnimator() {//简单的x轴y轴平移到100的位置,横向纵向放大到2倍,旋转180度,播放时长1sshowView.animate().x(100).y(100).scaleX(2).scaleY(2).rotation(180).setDuration(1000);}

ObjectAnimator

一般情况下,ObjectAnimator类是能属性动画写法简化的一个类。
ObjectAnimator方法有ofInt、ofFloat等方法,传入一个对象,一个对象的属性,一个数值变化范围(如0-100-1000),就会主动调用Object的Set方法不断去设置属性,并触发重绘。
XML动画制作写法:

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"android:duration="2000"android:propertyName="translationX"android:valueFrom="0"android:valueTo="100"android:valueType="floatType">
</objectAnimator>

JAVA引用XML文件方法

Animator animator = AnimatorInflater.loadAnimator(context, R.animator.tranlation_animator);
animator.setTarget(view);
animator.start();

JAVA代码动画制作写法:

//将view的tranlationX属性,在2000ms从0变化到100
ObjectAnimator.ofFloat(view,"translationX",0,100).setDuration(2000).start();

AnimatorSet

动画集,关联多个Animator动画。

//以下动画播放顺序,1->(2,3)->4
AnimatorSet set = new AnimatorSet();
set.play(2).with(3).before(4).after(1);
//动画5在1000ms后播放。
set.play(5).after(1000);
set.setDuration(2000);
set.start();

ValueAnimator

ValueAnimator是ObjectAnimator的父类,它相当于只提供了一个数据变化的功能。需要自己去实现数据变化时,具体要执行的操作。大多数时候,我们自定义一些特殊的动画的时候,都是使用ValueAnimator类。
常见用法

ValueAnimator animator = ValueAnimator.ofFloat(0,100);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {float value = (float)animation.getAnimatedValue();//数值更新时进行的操作。}
});
animator.setDuration(2000);

ps:数值更新时应当使用postInvalidateOnAnimation来优化,postInvalidateOnAnimation 依赖上一帧动画的的执行时间,因为动画的刷新是存在一个频率的,直到下一帧动画的时间才会真正执行刷新操作。

动画监听

AnimatorListener,以上几种类型的动画都支持设置此监听

animator.addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationStart(Animator animation) {//动画开始监听}@Overridepublic void onAnimationEnd(Animator animation) {//动画结束监听}@Overridepublic void onAnimationCancel(Animator animation) {//动画取消监听}@Overridepublic void onAnimationRepeat(Animator animation) {//动画重复播放监听}
});

同时为了避免重写四个方法的繁琐,提供了AnimatorListenerAdapter类,只需要重写自己想要监听的方法即可。

TypeEvaluator

估值器:简单来说,就是告诉动画系统如何从初始值过渡到结束值。
以常见的ObjectAnimator.ofFloat()方法为例,
FloatEvaluator源码:

public Float evaluate(float fraction, Number startValue, Number endValue) {float startFloat = startValue.floatValue();return startFloat + fraction * (endValue.floatValue() - startFloat);}

可以看出来,其实就是初始值加上变化值。
看起来是不是很简单,但是就这玩意儿我们用好了,就可以实现一系列花里胡哨的动画了,什么圆形变成心形啦,什么心形弹弹弹啦。自定义的话,其实就是实现TypeEvaluator接口的evaluate方法啦~
举个简单的栗子吧:


public class Circle {private int r;public int getR() {return r;}public void setR(int r) {this.r = r;}
}public class CircleEvaluator implements TypeEvaluator<Circle> {@Overridepublic Circle evaluate(float fraction, Circle startValue, Circle endValue) {if (startValue == null || endValue == null) {return startValue;}int startR = startValue.getR();int endR = endValue.getR();int nowR = startR + (int) (fraction * (endR - startR));Circle nowCircle = new Circle();nowCircle.setR(nowR);return nowCircle;}
}

应该很明显就能看出来,这就是个简单的圆半径变化的估值器。大家可以想象一下利用这个玩意儿可以实现什么样的动画啦!

Interpolator

插值器:它的作用概括来说就是控制动画变化的速度。可以看到TypeEvaluator的接口evaluate方法中有一个fraction参数,这个参数的值其实就是根据Interpolator计算得出的。
我们平常使用属性动画时,系统默认的Interpolator其实就是一个先加速后减速的Interpolator,对应的实现类就是AccelerateDecelerateInterpolator。

@HasNativeInterpolator
public class AccelerateDecelerateInterpolator extends BaseInterpolatorimplements NativeInterpolatorFactory {public AccelerateDecelerateInterpolator() {}@SuppressWarnings({"UnusedDeclaration"})public AccelerateDecelerateInterpolator(Context context, AttributeSet attrs) {}public float getInterpolation(float input) {return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;}/** @hide */@Overridepublic long createNativeInterpolator() {return NativeInterpolatorFactoryHelper.createAccelerateDecelerateInterpolator();}
}

其中重点是getInterpolation()方法,这个方法就是最终提供给TypeEvaluator使用的fraction。
再举一个简单的栗子:

public class ReverseInterpolator implements Interpolator {@Overridepublic float getInterpolation(float input) {return 1 - input;}
}

这就简单的实现倒序的变化啦!是不是很easy!
再推荐大家一个变化函数直观看效果的网站(里面也有很多已经实现好的函数,用起来贼得劲!):
http://inloop.github.io/interpolator/
下面这个网站也包含了很多函数,大家也可以参考一下!
https://easings.net/cn#

ViewPropertyAnimator

专门提供给View的快捷的Animator操作。拥有更好的性能,只执行一次刷新操作就能将所有动画绘制一次,而我们平常使用的Animator每一个都需要绘制一次。

//简单的x轴y轴平移到100的位置,横向纵向放大到2倍,旋转180度,播放时长1s
view.animate().x(100).y(100).scaleX(2).scaleY(2).rotation(180).setDuration(1000);

ViewPropertyAnimator支持的方法还是挺多的,能满足咱们大多数的需求。而且调用真的是很方便!

Android 属性动画相关推荐

  1. android动画封装,Android属性动画封装,快速构建动画

    Android实现动画效果的方式主要有帧动画.补间动画.属性动画.关于安桌动画的基础知识可以查看这篇文章Android属性动画完全解析 这里我要讲的是如何快速构建出一个动画效果,如下图: 如果我们用属 ...

  2. Android属性动画 ObjectAnimator

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118709616 本文出自[赵彦军的博客] 文章目录 ObjectAnimator ...

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

    版权声明:本文出自郭霖的博客,转载必须注明出处. 目录(?)[-] ValueAnimator的高级用法 ObjectAnimator的高级用法 转载请注明出处:http://blog.csdn.ne ...

  4. android 属性动画实例,Android属性动画完全解析 中 ,ValueAnimator和ObjectAnimator的高级用法...

    大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是最常用的一些用法,这些用法足以覆盖我们平时大多情况下的动画需求了.但是,正如上篇文章当中所说到的,属性动画对补间动画进行了 ...

  5. Android 系统(196)---Android 属性动画

    Android 属性动画 属性动画 总结&攻略 前言 动画的使用 是 Android 开发中常用的知识 本文将详细介绍 Android 动画中 属性动画的原理 & 使用 动画类型 关于 ...

  6. Android 属性动画Property Animation(中)

    Android 属性动画Property Animation(上)介绍了属性动画的概念以及相关的类和接口,本篇来看下具体肿么使用. ValueAnimator ValueAnimator指定整形.浮点 ...

  7. Android 属性动画使用(二)

    首先扯点别的:晚上稍微跑了一会步,然后逛了超市,晚饭喝的南瓜粥,吃了一碗面条,今天不是太饿,现在正一边吃着葡萄一边学习,也是没谁了. 比如说,我们想要实现从0过渡到100,使用ValueAnimato ...

  8. android+属性动画+高度,android 自定义view+属性动画实现充电进度条

    近期项目中需要使用到一种类似手机电池充电进度的动画效果,以前没学属性动画的时候,是用图片+定时器的方式来完成的,最近一直在学习动画这一块,再加上复习一下自定义view的相关知识点,所以打算用属性动画和 ...

  9. Android 属性动画(一)新手入门

    一.属性动画简介 Android 中动画有很多种,属性动画就是其中的一种.所谓的属性动画,就是在指定的时间内,通过改变对象的属性达到变化效果的动画.在 Android 中,属性动画系统是一个强健的框架 ...

  10. Android 属性动画 详解

    Android 属性动画 详解 Android动画类型: View Animation(即所谓的Tween Animation补间动画):View Animation相当简单,不过只能支持简单的缩放. ...

最新文章

  1. java中getDelta是什么意思_Java IResourceDelta.getMarkerDeltas方法代码示例
  2. 十四、Redis三种特殊类型之一Geospatial
  3. Unix整理笔记——起步——里程碑M2
  4. vuls漏洞扫描工具
  5. .Net连接Sybase数据库的几种方法[转]
  6. 开启log4net内部调试
  7. oracle函数分为几个大类,ORACLE常见分析函数有哪几类呢?
  8. Java使用表格显示日历编程_用java图形用户界面实现: 编写一个日历程序,能实现显示日历等简单功能。...
  9. 20155303 2016-2017-2 《Java程序设计》第九周学习总结
  10. mongodb 的进库操作
  11. Git项目下载部分文件或文件夹
  12. 计算机硬盘常用分区工具,三款好用的磁盘分区工具推荐
  13. 戴尔计算机没有硬盘驱动,在Dell计算机上重新安装系统后,如果找不到硬盘驱动器或引导设备该怎么办?...
  14. matplotlib画图教程系列之-堆积柱状图
  15. Linux/软件 - 资源[国外站点]
  16. PHP - 下载/传输远程服务器上的文件到本地服务器
  17. 计算机专硕毕业论文写什么,最新硕士毕业论文进度安排怎么写
  18. 【UE4】使用Composure插件在场景或UI中实时显示CineCamera画面
  19. For Your Dream
  20. 关于indexOf的全等匹配

热门文章

  1. 思岚激光雷达+cartographer建图
  2. [GIS热点] 网络篇-WebGIS、物联网、网格GIS、雾GIS、云计算
  3. LimeSDR GPS欺骗
  4. Creo 9.0 如何快速修改CAD坐标系?
  5. 计算机航嘉快捷启动键,win7 u盘启动快捷键是什么|win7 u盘启动按哪个键
  6. 数据库系统——数据模型基本概念详解
  7. 8. Numpy的索引和切片 (Indexing and Slicing)
  8. 模电_热敏PTC电阻_NTC电阻-区别与作用-20190507
  9. 微信扫一扫二维码直接打开手机默认外部浏览器
  10. PHP 生成PDF文件并向PDF添加图片