Android开发之Tween(补间动画)完全解析(下)

欢迎转载,转载请注明出处:http://blog.csdn.net/dmk877/article/details/51980734

在上一篇文章中,我们详细讨论了Tween动画的xml的实现以及interpolator的使用,相信通过上篇文章大家对Tween动画的xml属性的配置会有一个详细的理解,当然这篇文章也是承接上篇文章,所以强烈建议先阅读上篇文章:Android开发之Tween(补间动画)完全解析(上),这篇文章将从代码的角度实现上篇文章的效果。如有疑问请留言,如有谬误欢迎批评指正。

Tween动画回顾

Tween动画的分类:alpha(渐变)、scale(缩放)、translate(位移)、rotate(旋转),这四种动画都有从Animation继承过来的公共的方法,又拥有其独特的方法。其实针对我们在xml中的配置,在Android中都有与其对应的方法。首先来看看与这四种动画所对应的类

xml根标签 对应类 动画类型
alpha AlphaAnimation 渐变透明度动画
scale ScaleAnimation 渐变缩放动画
translate TranslateAnimation 渐变位置移动动画效果
roate RotateAnimation 渐变旋转动画效果

首先来看下它们的共有方法,也就是从Animation类继承的方法

xml属性 对应的方法 说明
android:duration setDuration(long) 动画执行时间
android:fillEnabled setFillEnabled(boolean) 与fillBefore结合使用
android:fillBefore setFillBefore(boolean) 动画结束后是否停留在初始状态
android:fillAfter setFillAfter(boolean) 动画结束后是否停留在最后状态
android:repeatMode setRepeatMode(int) 动画重复的类型
android:repeatCount setRepeatCount(int) 动画重复的次数
android:interpolator setInterpolator(Interpolator) 动画插值器

关于这些属性在上篇文章已经详细介绍过,就不再重复了介绍了,了解了这些之后,接着就逐一看看这四种动画吧。

AlphaAnimation

在上篇文章中我们提到在xml文件配置中alpha动画的xml文件配置有:
android:fromAlpha:动画开始时的透明度,变化范围为0.0-1.0,0.0表示完全透明,1.0表示完全不透明
android:toAlpha:动画结束是的透明度,变化范围和意义同上。
上篇针对alpha动画,我们的xml文件的配置为:

<?xml version="1.0" encoding= "utf-8"?>  
<alpha xmlns:android="http://schemas.android.com/apk/res/android"  
        android:fromAlpha= "0.0"  
        android:toAlpha= "1.0"  
        android:repeatCount= "2"  
        android:duration= "3000"  
        android:fillAfter= "true" >  
</alpha>

我们怎样用代码完成与上述xml文件配置相同的效果呢?其实很简单,针对alpha动画所特有的属性,将设置的数据传递到AlphaAnimation的构造方法中即可,AlphaAnimation所有的构造函数如下图所示:
这里写图片描述
可以看到它一共有两个构造函数,第一个构造函数我们一般不会用到,这里主要来看第二个构造函数,可以看到它接收两个float类型的值,一个是fromAlpha另外一个是toAlpha。也就是在上面xml文件中配置的,所以要想完成上述xml文件中的效果,这里的fromAlpha和toAlpha需要传的值分别是0和1,表示透明度从完全透明变化到完全不透明。对于公共的属性的设置,直接调用公共的方法进行设置就ok了。所以经过上述分析我们可以想到,上述xml文件的代码实现是下面这样的

AlphaAnimation alphaAnimation=new AlphaAnimation(0,1);
alphaAnimation.setDuration(3000);
alphaAnimation.setRepeatCount(2);
alphaAnimation.setFillAfter(true);
ivImage.setAnimation(alphaAnimation);

运行效果:
这里写图片描述
可以看到还是不错的,嗯,对这个妹子不错。0.0

ScaleAnimaion

ScaleAnimaton的特有的属性有

属性 含义
android:fromXScale 起始的X方向上相对自身的缩放比例
android:toXScale 结尾的X方向上相对自身的缩放比例
android:fromYScale 起始的Y方向上相对自身的缩放比例
android:toYScale 结尾的Y方向上相对自身的缩放比例
android:pivotX 缩放起点X轴坐标
android:fromYScale 缩放起点Y轴坐标

来看看它的构造函数
ScaleAnimation的构造函数图
看到它一共有四个构造函数,同样我们只看它的第二、三、四个构造函数,从构造函数中我们可以清楚的看到它构造函数中所需传的参数基本与xml文件中的配置一致,其中

ScaleAnimation scaleAnimation=new ScaleAnimation(fromX, toX, fromY, toY, pivotXType, pivotXValue, pivotYType, pivotYValue);

可能大家看到这个构造函数中的两个参数有点陌生:pivotXType和pivotXValue(这里以X为例)。我们知道xml文件中pivotX的取值可以为数值、百分数、百分数p,如50,50%,50%p。当为数值时,表示在当前View的左上角,即原点处加上50px,做为旋转点X坐标;如果是50%表示在当前控件的左上角加上自己宽度的50%做为旋转点X坐标;如果是50%p,那么就是表示在当前控件的左上角加上父控件宽度的50%做为旋转点X坐标。
这里的pivotXType就是用来指定我们采取的是哪种数值的。它有三种值:Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF、Animation.RELATIVE_TO_PARENT

取值 意义
Animation.ABSOLUTE 表示取值为数字
Animation.RELATIVE_TO_SELF 表示取值为百分数
Animation.RELATIVE_TO_PARENT 表示取值为百分数p

上篇我们的xml文件配置如下:

<?xml version="1.0" encoding= "utf-8"?>   
<scale xmlns:android="http://schemas.android.com/apk/res/android"  
       android:fromXScale= "2.0"  
       android:toXScale= "1.0"  
       android:fromYScale= "2.0"  
       android:toYScale= "1.0"  
       android:pivotX= "50%"  
       android:pivotY= "50%"  
       android:duration= "5000">  

</scale> 

通过上面的分析我可以知道它的代码实现是:

ScaleAnimation scaleAnimation=new ScaleAnimation(2.0f, 1.0f, 2.0f, 1.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
scaleAnimation.setDuration(5000);
ivImage.startAnimation(scaleAnimation);

运行效果图就不贴了,如果有兴趣大家可以动手试试。

TranslateAnimation

TranslateAnimation独有的属性:

属性 意义
android:fromXDelta 起始点X轴坐标,可以是数值、百分数、百分数p 三种样式
android:fromYDelta 起始点Y轴坐标,可以是数值、百分数、百分数p 三种样式
android:toXDelta 结束点X坐标
android:toYDelta 结束点Y坐标

首先来看看它的构造函数
这里写图片描述
可以看到它有三个构造函数,其中第三个构造函数中fromXType、fromXValue中的fromXType的取值与上面ScaleAnimaion中的pivotXType的取值是一样的,具体可以看看上面那个表格。
第二个构造函数需要传递fromXDelta、toXDelta、fromYDelta、toYDelta,当采用这个构造函数时默认的是使用Animation.ABSOLUTE,对应xml中的取值为数值。
假如xml文件的配置如下

<?xml version="1.0" encoding= "utf-8"?>  
<translate     xmlns:android="http://schemas.android.com/apk/res/android"   
    android:fromXDelta="0"  
    android:fromYDelta="0"  
    android:toXDelta="200"  
    android:toYDelta="300"  
    android:duration="5000">  
</translate>

通过上面的分析我们应该知道与之效果相同的代码实现如下

TranslateAnimation translateAnimation=new TranslateAnimation(Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 200, Animation.ABSOLUTE, 300);
translateAnimation.setDuration(5000);
ivImage.setAnimation(translateAnimation);

RoateAnimation

RoateAnimation独有的属性

属性 意义
android:fromDegrees 动画开始时旋转的角度位置,float类型,正值代表顺时针方向度数,负值代码逆时针方向度数
android:toDegrees 动画结束时旋转到的角度位置,float类型,正值代表顺时针方向度数,负值代码逆时针方向度数
android:pivotX 旋转点X轴坐标,float类型,可以是数值、百分数、百分数p三种样式
android:pivotY 旋转点Y轴坐标,取值及意义跟android:pivotX一样

来看看它的构造函数
这里写图片描述
可以看到第二个构造函数中需要两个参数fromDegrees、toDegrees这个构造函数默认的旋转的起点是View的左上角的那个点。
第三个构造函数在第二个的基础之上增加了pivotX和pivotY,用来调整View围绕旋转的那个点。它默认的pivotType是Animation.ABSOLUTE及相当于xml中取值为数值。
第四个构造函数就比较全面了,增加了每个值得pivotType与上面ScaleAnimaion中pivotType是一致的。
假如xml文件中的配置如下:

<?xml version="1.0" encoding= "utf-8"?>  
<rotate xmlns:android="http://schemas.android.com/apk/res/android"  
         android:fromDegrees= "0"  
         android:toDegrees= "360"  
         android:pivotX= "50%"  
         android:pivotY= "50%"  
         android:duration= "10000">  
</rotate> 

通过上面的分析我们应该知道与之对应的代码实现如下:

RotateAnimation rotateAnimation=new RotateAnimation(0, 360,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnimation.setDuration(3000);
ivImage.startAnimation(rotateAnimation);

Interpolator插值器

为动画使用插值器也非常简单,直接调用setInterpolator(Interpolator)这个方法就可以了,这里就以TranslateAnimation添加一个小球回弹的插值器为例进行演示。xml文件如下

<?xml version="1.0" encoding="utf-8"?>
<translate     xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/bounce_interpolator" 
    android:fromXDelta="0"
    android:fromYDelta="0"
    android:toXDelta="0"
    android:fillAfter="true"
    android:toYDelta="250"
    android:duration="2000">
</translate>

与之对应的代码

TranslateAnimation translateAnimation=new TranslateAnimation(Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 250);
translateAnimation.setInterpolator(new BounceInterpolator());
translateAnimation.setFillAfter(true);
translateAnimation.setDuration(2000);

ivDot.startAnimation(translateAnimation);

运行效果如下:
这里写图片描述

AnimationSet

上面我们所讨论的都是单个的动画,当我们需要将几种动画同时运用到同一个View的时候,就需要用到AnimationSet这个类了。首先来看看它的构造函数
这里写图片描述
一般我们都是用到第一个构造函数,可以看到它的第一个参数是boolean shareInterpolator从名字也能看出来它的作用是标识是否将AnimationSet中的插值器运用到集合中的所有动画,为true表示AnimationSet集合中的所有动画都用AnimationSet中设置的插值器,false表示AnimatonSet集合中的动画想用哪个动画,需要自己设置。

<?xml version="1.0" encoding= "utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true">

    <alpha
        android:fromAlpha= "0.0"
        android:toAlpha= "1.0"
        android:duration= "3000" />

    <scale
        android:fromXScale= "0.0"
        android:toXScale= "1.0"
        android:fromYScale= "0.0"
        android:toYScale= "1.0"
        android:pivotX= "50%"
        android:pivotY= "50%"
        android:duration= "3000" />

    <rotate
        android:fromDegrees= "0"
        android:toDegrees= "720"
        android:pivotX= "50%"
        android:pivotY= "50%"
        android:duration= "3000"/>

     <translate
        android:startOffset= "3000"
        android:fromXDelta= "0"
        android:fromYDelta= "0"
        android:toXDelta= "85"
        android:toYDelta= "0"
        android:duration= "1000" />

    <alpha
        android:startOffset= "4000"
        android:fromAlpha= "1.0"
        android:toAlpha= "0.0"
        android:duration= "1000" />

</set>

检验的时刻到了,上面是一个比较综合的动画,包含了四种类型的动画,如果能完成上面这个动画,那Tween动画掌握的也就差不多了,所以有时间大家最好动手敲敲代码,与之对应的代码实现如下:

ScaleAnimation scaleAnimation=new ScaleAnimation(0f, 1f, 0f, 1f,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
scaleAnimation.setDuration(3000);

RotateAnimation rotateAnimation=new RotateAnimation(0, 720, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnimation.setDuration(3000);

TranslateAnimation translateAnimation=new TranslateAnimation(Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 85, Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 0);
translateAnimation.setDuration(1000);
translateAnimation.setStartOffset(3000);

AlphaAnimation alphaAnimation=new AlphaAnimation(1f,0f);
alphaAnimation.setDuration(1000);
alphaAnimation.setStartOffset(4000);

AnimationSet animationSet=new AnimationSet(false);
animationSet.addAnimation(scaleAnimation);
animationSet.addAnimation(rotateAnimation);
animationSet.addAnimation(translateAnimation);
animationSet.addAnimation(alphaAnimation);

ivImage.startAnimation(animationSet);

运行效果:
这里写图片描述
效果还算不错。好了到这里关于Tween动画的讨论就结束了,希望对你有帮助。锁定本台敬请期待下篇,PropertyAnimation属性动画完全解析。
如有疑问请留言,如有谬误欢迎批评指正。

欢迎转载,转载请注明出处:http://blog.csdn.net/dmk877/article/details/51980734

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。

Android闹钟设置的解决方案 - 2016-07-25 14:07:00

Android设置闹钟并不像IOS那样这么简单,做过Android设置闹钟的开发者都知道里面的坑有多深。下面记录一下,我解决Android闹钟设置的解决方案。 主要问题 API19开始AlarmManager的机制修改。 应用程序被Kill掉后,设置的闹钟不响。 6.0以上进入Doze模式会使JobScheduler停止工作。 手机设置重启后,闹钟失效问题。 API19以上AlarmManager机制的修改 API19之前AlarmManager提供了三个设置闹钟的方法,由于业务需求闹钟只需要一次性,所以
start_kernel之前的汇编代码建立了内核临时页表,完成了内核区域的静态线性映射,保证内核可以在舒适的虚拟地址空间(运行地址和链接地址一致)运行。进入start_kernel之后就要准备建立完整的页表映射,这部分工作是在paging_init中完成。 不过在建立完整页表映射之前还需要进行一些准备工作,本文来分析下。 为了简化整个代码流程,便于分析,我的设备内核配置为不使用高端内存,不配置CONFIG_HIGHMEM。bootargs中传给内核的mem=256. 内核版本号:3.4.55 paging

App的打磨之路(下) - 2016-07-25 14:07:48

前言:该文接上两篇博文 App的打磨之路(上) 和 App的打磨之路(中) ,继续描述打包、反编译及加固。 一、打包 每个Android应用在完成后都需要打成APK包,对于单个打包的方式在此就不赘述了,基本IDE都带,只是在对外发布的应用需要配置属于该应用的唯一签名,下文主要讲述需要上传多个市场的情况下怎么批量打包。 1、Maven打包 Maven是一个项目管理工具,它包含了一个项目对象模型(Project Object Model),一组标准集合,一个项目生命周期(ProjectLifecycle),一

PendingIntent的内部机制 - 2016-07-25 14:07:48

摘自;http://my.oschina.net/youranhongcha/blog/196933   1 概述         在Android中,我们常常使用PendingIntent来表达一种“留待日后处理”的意思。从这个角度来说,PendingIntent可以被理解为一种特殊的异步处理机制。不过,单就命名而言,PendingIntent其实具有一定误导性,因为它既不继承于Intent,也不包含Intent,它的核心可以粗略地汇总成四个字——“异步激发”。         很明显,这种异步激发常常
Android framework提供了许多标准的工具,来创建有吸引力的、功能丰富的用户图形界面。但是,如果你想要更多的控制权,比如在应用程序的屏幕上绘图,或者冒险进入三维图形,你需要使用不同的工具。通过Android framework提供的OpenGL ES的API提供了一套显示高端的工具,动画图像超出你的想象,许多Android设备的图像处理单元得到了加速(GPUs)。 这节课主要开发一个OpenGL应用程序、包括设置、画对象、移动对象元素、响应触摸输入事件。 这节课的示例代码使用的是OpenGL

来仿一仿retrofit - 2016-07-25 14:07:32

为什么要重复造轮子 在开发领域有一句很流行的话就是 不要重复造轮子 , 因为我们在开发中用到的很多东西早已有很多人去实现了, 而且这些实现都是经过时间和开发者检验过的, 一般不会遇到什么坑, 而如果我们自己去实现的话, 那不仅会增加工作量, 最大的隐患还是我们并不能预见以后是否会遇到大坑. 不过大家注意了吗. 上面 不要重复造轮子 的一个前提是 开发中 , 是的, 这句名言在开发中是适用的, 那在学习阶段的? 我可以大概的告诉你- 忘记这句话! , 为什么 不要重复造轮子 不适合在学习阶段使用呢? 如果我
背景 前面一篇总结了Serializable的序列化与反序列化,现在接着总结XML。主要内容:XML基本的序列化与反序列化方法、一些注意事项、以及自定义了一个XML注解框架(简洁代码,解放双手)。 XML的序列化与反序列化 先与Serializable进行简单的对比: Serializable存储的文件,打开后无法正常查看,安全性高。xml文件可通过文本编辑器查看与编辑,可读性高(浏览器会格式化xml文件,更方便查看),安全性低; Serializable文件通过了签名,只能在自己的程序中反序列化,或RM
每日更新关注 : http://weibo.com/hanjunqiang   新浪微博! iOS 开发者交流QQ群 : 446310206   有问题或技术交流可以咨询! 欢迎加入 ! 这篇直接搬了一份官方文档过来看的 由于之前没用markdown搞的乱七八糟的 所以重新做了一份 后面看到官网的中文文档更新不及时看着英文翻译了一点 搞的更乱了 :( 英文好的直接点右边- 官方OC文档 Realm 是一个移动端的数据库, Realm 是 SQLite 和 CoreData 的替代者。它可以节省你成千上万行

2.3.1 存储数据到data目录中 - 2016-07-25 14:07:09

当应用安装到Android后,系统会根据每个应用的包名创建一个/data/data/包名/的文件夹,访问自己包名下的目录是不需要权限的,并且Android已经提供了非常简便的API可以直接去访问该文件夹。 下面以一个案例来演示data目录的使用。 一、需求 如图1-5 所示,在用户将CheckBox选中的前提下点击登录,就将用户名和密码保存在data文件夹中,在用户不勾选CheckBox的前提下点击登录,就不保存用户名和密码,同时删除data文件中的历史数据。 如果数据已经保存到了data目录中,那么下次
本页面更新日期: 2016年07月23日 package 包 前面提到了 包 这个概念. 什么是包? 由于非常多的人参与 Java 的开发, 这难免会遇到一个问题 – 类名冲突 . 也就是说难免会遇到重名的情况. 所以 Java 引入了包这个机制. 提供了类的多层命名空间. 用于解决类的命名冲突 / 类文件管理等问题. Java允许将一组功能相关的类放在同一个 package 下. 从而组成逻辑上的 类库单元 . 如果希望把一个类放在指定的包结构下,应该在Java源程序的第一个非注释行放置如下格式的代码: