android+3.0新加的动画,Android动画片

使用Android两年多了,工作中的动画也动能应付,自认为Android中的动画自己也能用个八九不离十,结果我在学习[Periscope点赞效果](http://www.jianshu.com/p/03fdcfd3ae9c)的时候发现动画的这些高级功能我从没用过、也没见过,静下来仔细想了下,我也并不明白Android动画的实现原理,以及生么时候用什么,从视频以及ApiDemo中看到的LayoutAnimator以及颜色渐变、类似弹簧的反复回弹也都没思路。于是我就研究了下Android的这些动画并记录了下来。

3.0以前,android支持两种动画模式,tween animation,frame animation,在3.0中又引入了一个新的动画系统:property animation,这三种动画模式在SDK中被称为property animation,view animation,drawable animation

1. View Animation(Tween Animation)

View Animation(Tween Animation):补间动画,给出两个关键帧,通过一些算法将给定属性值在给定的时间内在两个关键帧间渐变。(xml方式是在anim文件夹中)

a.View Animation只能用于View对象,而且职能支持一部分功能:位移(translate)、旋转(rotate)、缩放(scale)、透明度渐变(alpha)

b.还有一个局限性:对于View Animation,它只是改变了View对象绘制的位置,而没有改变View对象本身(例如:做一个位移动画,那么可点击的位置仅仅还是View开始所在的位置,跟移动中的这个动画并无关系)

c.实现原理:是父布局不断的画出一个外表一样的图像,不断的通过invalidate 去进行重绘,动画的算法其实都是在Transformation的Matrix矩阵中。

2. Drawable Animation(Frame Animation)

Drawable Animation(Frame Animation):帧动画,就像GIF图片,通过一系列Drawable依次显示来模拟动画的效果。(xml方式是在drawable中)

Android中播放GIF图片的时候,可使用这种方式(先分解成单个图片)。

3. Property Animation

Android 3.0引入,顾名思义,它是实际更改view的属性,而不像Tween Animation 仅仅是父布局绘制一个替身,所以Property Animation的功能会强大很多。(在包android.animation下)

相同:

Property Animation 兼容了 Tween Animation的所有功能:设置动画时间、支持(位移、旋转、缩放、透明度渐变)、类似的监听(开始、结束、取消、重复)、插补器

加强功能:

后浪推前浪,后出来的Property Animation带来了更强悍的功能:

1. Evaluators(计算器):告诉Property Animation系统如何去计算属性值

IntEvaluator:用于计算Int类型属性值的计算器。

FloatEvaluator:用于计算Float类型属性值的计算器。

ArgbEvaluator:用于计算以16进制形式表示的颜色值的计算器。

TypeEvaluator:一个计算器接口,它允许你创建你自己的计算器。如果你正在计算一个对象属性并不是int,float或者颜色值类型的,那么你必须实现TypeEvaluator接口去指定如何去计算对象的属性值。

2. 新加了ValueAnimator.AnimatorUpdateListener 监听

onAnimationUpdate() - 在动画的每一帧上调用. 在这个方法中,你可以使用ValueAnimator的getAnimatedValue()方法来获取(Evaluators)计算出来的值。

AnimationSet提供了一个把多个动画组合成一个组合的机制,并可设置组中动画的时序关系,如同时播放,顺序播放等。

3. 新增属性动画的同时,也新增了View的属性的设置获取方法

Example:getLeft、getX、getTranslationX等等

4. 通过AnimationSet应用多个动画

以下例子同时应用5个动画:

播放anim1;

同时播放anim2,anim3,anim4;

播放anim5。

AnimatorSet bouncer = new AnimatorSet();

bouncer.play(anim1).before(anim2);

bouncer.play(anim2).with(anim3);

bouncer.play(anim2).with(anim4)

bouncer.play(anim5).after(amin2);

animatorSet.start();

5. ObjectAnimator与ValueAnimator之间的关系:

其实ObjectAnimator继承与ValueAnimator,ObjectAnimator是为了提供简便的方法,可以直接修改alpha、backgroundColor、translationX、x、y、width等,甚至是一个普通对象的属性,一言以蔽之如果直接通过属性名改属性就用ObjectAnimator

例子:Periscope点赞效果实现

1112033266.gif

我又换了种方式实现了下,运用我们的属性动画,直接在ViewGroup上画出来:

1112033267.gif

代码传送门

6. 同一对象的多个属性同时变化可优化

如果需要对一个View的多个属性进行动画可以用ViewPropertyAnimator类,该类对多属性动画进行了优化,会合并一些invalidate()来减少刷新视图,该类在3.1中引入。

以下两段代码实现同样的效果:

PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat(“x”, 50f);

PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat(“y”, 100f);

ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvyY).start();

myView.animate().x(50f).y(100f);

7. 原理:异步根据插补器与Evaluator计算出当前View的属性,再通过handler.post到UI线程,通过反射给View设置当前属性。

老版本的Property Animation原理讲解

Tween Animation 与 Property Animation 使用选择:

因为Property Animation最终跟新UI其实也需要重新绘图,所以,属性动画肯定比Tween Animation要更好性能得多,理论上流畅度也稍稍差点。

所以建议能用Tween Animation的地方,还是使用Tween 动画。

根据ApiDemo罗列了以下几个实用场景(此处会有不少新的用法):

1. 颜色渐变

1112033268.gif

private static final int RED = 0xffFF8080;

private static final int BLUE = 0xff8080FF;

ValueAnimator colorAnim = ObjectAnimator.ofInt(this, "backgroundColor", RED, BLUE);

colorAnim.setDuration(3000);

colorAnim.setEvaluator(new ArgbEvaluator());

colorAnim.setRepeatCount(ValueAnimator.INFINITE);

colorAnim.setRepeatMode(ValueAnimator.REVERSE);

colorAnim.start();

2. 布局显示、不显示、隐藏(LayoutTransition)

1112033269.gif

ViewGroup中的子元素可以通过setVisibility使其Visible、Invisible或Gone,当有子元素可见性改变时,可以向其应用动画,通过LayoutTransition类应用此类动画:

transition.setAnimator(LayoutTransition.DISAPPEARING, customDisappearingAnim);

通过setAnimator应用动画,第一个参数表示应用的情境,可以以下4种类型:

APPEARING        当一个元素变为Visible时对其应用的动画

CHANGE_APPEARING   当一个元素变为Visible时,因系统要重新布局有一些元素需要移动,这些要移动的元素应用的动画

DISAPPEARING      当一个元素变为InVisible时对其应用的动画

CHANGE_DISAPPEARING 当一个元素变为Gone时,因系统要重新布局有一些元素需要移动,这些要移动的元素应用的动画 disappearing from the

container.

步骤:

1. 给view设置LayoutTransition

LayoutTransition mTransitioner = new LayoutTransition();

view.setLayoutTransition(mTransitioner);

2. 设置对应时间

Transitioner.setStagger(LayoutTransition.CHANGE_APPEARING, 500);

3. 设置动画

ObjectAnimator changeIn = ObjectAnimator.ofPropertyValuesHolder(

this, pvhLeft, pvhRight, pvhScaleX, pvhScaleY).

setDuration(mTransitioner.getDuration(LayoutTransition.CHANGE_APPEARING));

mTransitioner.setAnimator(LayoutTransition.CHANGE_APPEARING, changeIn);

4. 搞定

3. Keyframes

keyFrame是一个 时间/值 对,通过它可以定义一个在特定时间的特定状态,而且在两个keyFrame之间可以定义不同的Interpolator,就相当多个动画的拼接,第一个动画的结束点是第二个动画的开始点。KeyFrame是抽象类,要通过ofInt(),ofFloat(),ofObject()获得适当的KeyFrame,然后通过PropertyValuesHolder.ofKeyframe获得PropertyValuesHolder对象

Keyframe kf0 = Keyframe.ofFloat(0f, 0f);

Keyframe kf1 = Keyframe.ofFloat(.9999f, 360f);

Keyframe kf2 = Keyframe.ofFloat(1f, 0f);

PropertyValuesHolder pvhRotation =

PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2);

final ObjectAnimator changeOut = ObjectAnimator.ofPropertyValuesHolder(

this, pvhLeft, pvhRight, pvhRotation).

setDuration(mTransitioner.getDuration(LayoutTransition.CHANGE_DISAPPEARING));

4. 弹跳

1112033270.gif

弹跳插补器:bounceAnim.setInterpolator(new BounceInterpolator());

1112033271.gif

设置特定一个时间点,显示在那帧位置上

bounceAnim.setCurrentPlayTime(seekTime);

5. 反转切换布局

1112033272.gif

其实就是一个旋转动画的拼接,一组对立的插补器(加速AccelerateInterpolator、减速DecelerateInterpolator)

ObjectAnimator visToInvis = ObjectAnimator.ofFloat(visibleList, "rotationY", 0f, 90f);

visToInvis.setDuration(500);

visToInvis.setInterpolator(accelerator);

final ObjectAnimator invisToVis = ObjectAnimator.ofFloat(invisibleList, "rotationY",

-90f, 0f);

invisToVis.setDuration(500);

invisToVis.setInterpolator(decelerator);

visToInvis.addListener(new AnimatorListenerAdapter() {

@Override

public void onAnimationEnd(Animator anim) {

visibleList.setVisibility(View.GONE);

invisToVis.start();

invisibleList.setVisibility(View.VISIBLE);

}

});

visToInvis.start();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在线打开html文件,html是什么文件?html文件怎么打开?

html是什么?html即超文本标记语言,现在大多网页都是html的格式。而所谓的html文件是一种超文本文件,其中超文本可以是图片或音乐等非文字元素,使用很广泛。但是很多用户都不太明白html是什么文件?也不清楚html文件要如…

gsoap使用心得! (win32)

最近换了个工作环境,现在在大望路这边上班,呵,刚上班接到的任务就是熟悉gsoap!废话少说,现在开始gSoap学习!gSOAP是一个夸平台的,用于开发Web Service服务端和客户端的工具,在Window…

html怎么置顶导航栏,css怎么实现滚动页面导航栏固定在顶部

css怎么实现滚动页面导航栏固定在顶部(吸顶效果)功能:当网页向下滚动时,导航栏一直在固定在顶部一、css设置这里主要用到css中position中的relative与fixed;其中relative是生成相对定位的元素,相对于其正常位置进行定位。fixed是生…

numpy读取csv_Numpy——IO操作与数据处理

一、问题?大多数数据并不是我们自己构造的,存在文件当中。我们需要工具去获取,但是Numpy其实并不适合去读取处理数据,这里我们了解相关API,以及Numpy不方便的地方即可。二、Numpy读取genfromtxt(fname[, dtype, commen…

android 中radiogroup滑动切换,巧妙实现缺角radiogroup控制多个fragment切换和滑动

在android开发中,用一个radiogroup控制多个fragment切换是十分常见的需求。但是如果fragment是一个ListView,如何保证滑动的时候通过缺角可以看到下面的listview是一个难点。直接上图:(1)完美效果(2)较差效果另外,不妨假设缺角的高度是5dp&am…

荣耀智慧屏评测 鸿蒙OS加持,荣耀智慧屏评测:鸿蒙OS加持 面向未来的超智能电视...

原标题:荣耀智慧屏评测:鸿蒙OS加持 面向未来的超智能电视 来源:TechWeb.com.cn当华为选择在今年公布鸿蒙OS系统后,很多人都在期待它的庐山真面目。无论是以后非常时期不再受制于人,或是循序渐进将系统过渡给自家设备&a…

2021河南固高高考成绩查询,河南信阳最好的4所高中,前三所学霸如云,看看有没有你的母校?...

河南省信阳市处于豫之南,鄂之北。南边是连绵的群山,北边是广袤的平原。千里淮河,曲折盘旋,它的源头便是这里。都说信阳是一个神奇的地方,一点儿也不为过,狮河穿城而过,周围群山环抱,…

磁盘的磁道(Track)

写这篇文章,主要是为了解决长久以来的一个困惑。由此也可以看出偶以前确实不太聪明。 哈哈(虽然现在仍然还是) 以前见到的很多磁道的示意图都是这样的:注意标线的位置,“指向一条线”,我当时的理解好像是这条线就是磁道。还有的解…

centos 卸载_CentOS安装mysql

安装mysql第一步,查看是否安装:rpm -qa| grep mysql-server没有我们就开始安装,点击 这里,获取下载页面,按照图示选择合适的版本:第二步,进入/usr/local/soft/目录,在里面执行wget 下…

细数改善WPF应用程序性能的10大方法

WPF(Windows Presentation Foundation)应用程序在没有图形加速设备的机器上运行速度很慢是个公开的秘密,给用户的感觉是它太吃资源了,WPF程序的性能和硬件确实有很大的关系,越高档的机器性能越有优势。 程序性能改善不是一蹴而就的&#xff…

javaweb宿舍管理系统源码_宿舍信息管理系统展示

宿舍信息管理系统今天整理学习笔记的时候发现了自己当时学SSM框架的时候写了一个简单的Javaweb宿舍信息管理系统,虽然现在看来写的不是很好,但今日写此文章也算是纪念自己的第一个SSM小项目了,话不多说,直接开始。项目简介&#x…

Qt UDP的初步使用

为了使用Qt自带的Socket进行网络编程,先必须熟悉Socket编程的原理,另外还需对Qt一些基本类的操作比较熟悉。由于刚接触不久,所以还是以看人家的代码来学习。这次主要是学Qt下UDP的编程,且熟悉一些Qt下代码的编写流程,所…

下列哪一项不是计算机网络的典型应用,09级计算机信息网络试卷A

…………密…………封…………线…………内…………请…………不…………要…………答…………题…………河北工程大学11~12学年第二学期期末考试试卷A一、填空题(每空1分,共10分)1、在因特网中,远程登录Telnet系统采用的应用工作模式为____客户机&#…

hdu 4452

今天模拟赛的一个模拟题&#xff1b; 每次看到这种题就感觉很繁琐&#xff1b; 这次静下心来写写&#xff0c;感觉还不错&#xff01;就是很多错误&#xff0c;浪费了一点时间&#xff1b; 代码&#xff1a; 1 #include<cstdio>2 #include<cstring>3 using namespa…

openpyxl 绘制饼形图_好享学丨快速上手Pythonmatplotlib 箱线图绘制,学术人必备

好享学是高下制图推出的关于数据可视化经验分享栏目&#xff0c;我们将定期与您分享各界优秀人士的制图经验&#xff0c;一同学习。01. 引言箱线图(Boxplot) 是一种用作显示一组数据分散情况资料的统计图表&#xff0c;本期推文就如何使用matplotlib和seaborn 绘制出高度定制化…

揭开Socket编程的面纱

对TCP/IP、UDP、Socket编程这些词你不会很陌生吧&#xff1f;随着网络技术的发展&#xff0c;这些词充斥着我们的耳朵。那么我想问&#xff1a; 1. 什么是TCP/IP、UDP&#xff1f; 2. Socket在哪里呢&#xff1f; 3. Socket是什么呢&#xff1f; 4. 你会使用它们吗&#xff1f;…

socket中的函数遇见EINTR的处理

这几天&#xff0c;写服务器代码过程当中&#xff0c;遇见EINRT信号的问题&#xff0c;我是借鉴 《unp 》&#xff0c;采用continue或者goto again循环解决的。但是感觉这个还是很有必要记录一下。网络上查找到的信息很多。下面是我查找到的和EINTR有关的介绍&#xff1a;1 ht…

vue 如何获取图片的原图尺寸_公众号封面图片尺寸是多少?如何在公众号里制作封面图?...

公众号文章封面图是自己动手制作还是直接使用网络图片呢&#xff1f;在刚开始接触公众号运营时&#xff0c;我的大部分插图和封面图都是直接选择网络图片&#xff0c;后来才发现&#xff0c;自己制作的封面图更能传达文章的内容&#xff0c;阅读效果更好。其实很多做公众号的人…

信号中断 与 慢系统调用

1. 术语 1.1. 慢系统调用&#xff08;Slow system call&#xff09; 该术语适用于那些可能永远阻塞的系统调用。永远阻塞的系统调用是指调用永远无法返回&#xff0c;多数网络支持函数都属于这一类。如&#xff1a;若没有客户连接到服务器上&#xff0c;那么服务器的accept调用…

delete hive_Hive高级调优

Hive调优策略Hive作为大数据领域常用的数据仓库组件&#xff0c;在设计和开发阶段需要注意效率。影响Hive效率的不仅仅是数据量过大;数据倾斜、数据冗余、job(小文件多)或I/O过多、MapReduce分配不合理等因素都对Hive的效率有影响。对Hive的调优既包含对HiveQL语句本身的优化&a…