Android 属性动画
属性动画
- 介绍
- 先上全部代码:
- 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 属性动画相关推荐
- android动画封装,Android属性动画封装,快速构建动画
Android实现动画效果的方式主要有帧动画.补间动画.属性动画.关于安桌动画的基础知识可以查看这篇文章Android属性动画完全解析 这里我要讲的是如何快速构建出一个动画效果,如下图: 如果我们用属 ...
- Android属性动画 ObjectAnimator
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118709616 本文出自[赵彦军的博客] 文章目录 ObjectAnimator ...
- (转)Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
版权声明:本文出自郭霖的博客,转载必须注明出处. 目录(?)[-] ValueAnimator的高级用法 ObjectAnimator的高级用法 转载请注明出处:http://blog.csdn.ne ...
- android 属性动画实例,Android属性动画完全解析 中 ,ValueAnimator和ObjectAnimator的高级用法...
大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是最常用的一些用法,这些用法足以覆盖我们平时大多情况下的动画需求了.但是,正如上篇文章当中所说到的,属性动画对补间动画进行了 ...
- Android 系统(196)---Android 属性动画
Android 属性动画 属性动画 总结&攻略 前言 动画的使用 是 Android 开发中常用的知识 本文将详细介绍 Android 动画中 属性动画的原理 & 使用 动画类型 关于 ...
- Android 属性动画Property Animation(中)
Android 属性动画Property Animation(上)介绍了属性动画的概念以及相关的类和接口,本篇来看下具体肿么使用. ValueAnimator ValueAnimator指定整形.浮点 ...
- Android 属性动画使用(二)
首先扯点别的:晚上稍微跑了一会步,然后逛了超市,晚饭喝的南瓜粥,吃了一碗面条,今天不是太饿,现在正一边吃着葡萄一边学习,也是没谁了. 比如说,我们想要实现从0过渡到100,使用ValueAnimato ...
- android+属性动画+高度,android 自定义view+属性动画实现充电进度条
近期项目中需要使用到一种类似手机电池充电进度的动画效果,以前没学属性动画的时候,是用图片+定时器的方式来完成的,最近一直在学习动画这一块,再加上复习一下自定义view的相关知识点,所以打算用属性动画和 ...
- Android 属性动画(一)新手入门
一.属性动画简介 Android 中动画有很多种,属性动画就是其中的一种.所谓的属性动画,就是在指定的时间内,通过改变对象的属性达到变化效果的动画.在 Android 中,属性动画系统是一个强健的框架 ...
- Android 属性动画 详解
Android 属性动画 详解 Android动画类型: View Animation(即所谓的Tween Animation补间动画):View Animation相当简单,不过只能支持简单的缩放. ...
最新文章
- java中getDelta是什么意思_Java IResourceDelta.getMarkerDeltas方法代码示例
- 十四、Redis三种特殊类型之一Geospatial
- Unix整理笔记——起步——里程碑M2
- vuls漏洞扫描工具
- .Net连接Sybase数据库的几种方法[转]
- 开启log4net内部调试
- oracle函数分为几个大类,ORACLE常见分析函数有哪几类呢?
- Java使用表格显示日历编程_用java图形用户界面实现: 编写一个日历程序,能实现显示日历等简单功能。...
- 20155303 2016-2017-2 《Java程序设计》第九周学习总结
- mongodb 的进库操作
- Git项目下载部分文件或文件夹
- 计算机硬盘常用分区工具,三款好用的磁盘分区工具推荐
- 戴尔计算机没有硬盘驱动,在Dell计算机上重新安装系统后,如果找不到硬盘驱动器或引导设备该怎么办?...
- matplotlib画图教程系列之-堆积柱状图
- Linux/软件 - 资源[国外站点]
- PHP - 下载/传输远程服务器上的文件到本地服务器
- 计算机专硕毕业论文写什么,最新硕士毕业论文进度安排怎么写
- 【UE4】使用Composure插件在场景或UI中实时显示CineCamera画面
- For Your Dream
- 关于indexOf的全等匹配
热门文章
- 思岚激光雷达+cartographer建图
- [GIS热点] 网络篇-WebGIS、物联网、网格GIS、雾GIS、云计算
- LimeSDR GPS欺骗
- Creo 9.0 如何快速修改CAD坐标系?
- 计算机航嘉快捷启动键,win7 u盘启动快捷键是什么|win7 u盘启动按哪个键
- 数据库系统——数据模型基本概念详解
- 8. Numpy的索引和切片 (Indexing and Slicing)
- 模电_热敏PTC电阻_NTC电阻-区别与作用-20190507
- 微信扫一扫二维码直接打开手机默认外部浏览器
- PHP 生成PDF文件并向PDF添加图片