Android开发艺术探索学习笔记(七)_Android

第七章 Android动画深入分析

 Android的动画分为三种:View动画,帧动画,属性动画。帧动画属于View动画。

7.1 View动画

    View动画的作用对象是View,共有四种动画效果:平移(Translate),缩放(Scale),旋转(Rotate),透明度(Alpha)。

7.1.1 View动画的种类

 View动画的保存路径:res/anim/filename.xml。XML格式语法如下:

<?xml version="1.0" encoding="utf-8" ?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/interpolator_resource"
android:shareInterpolator="true|false">
<alpha
android:fromAlpha="float"<!-- 透明度起始值-->
android:toAlpha="float"/><!-- 透明度结束值-->
<scale
android:fromXScale="float"<!--水平方向缩放起始值 -->
android:toXScale="float"<!--水平方向缩放结束值 -->
android:fromYScale="float"<!--垂直方向缩放起始值 -->
android:toYScale="float"<!--垂直方向缩放结束值 -->
android:pivotX="float"<!--缩放轴点x坐标 -->
android:pivotY="float"/><!--缩放轴点y坐标 -->
<translate
android:fromXDelta="float"<!--x的起始位置-->
android:fromYDelta="float"<!--y的起始位置-->
android:toXDelta="float"<!--x的结束位置-->
android:toYDelta="float"/><!--y的结束位置-->
<rotate
android:fromDegrees="float"<!--起始角度 -->
android:toDegrees="float"<!-- 结束角度-->
android:pivotX="float"<!-- 旋转轴点x坐标 -->
android:pivotY="float"/><!-- 旋转轴点y坐标-->
<set>
...
</set>
</set> 

<set>标签表示动画集合,对应AnimationSet类,内部还可以嵌套其他动画集合。

android:interpolator 插值器规定动画已怎样的速度运行,默认为加速减速插值器。

android:shareInterpolator 集合中的动画是否和集合共享同一个插值器。

android:duration 动画持续时间

android:fillAfter 动画结束后View是否停留在结束位置。

<scale>、<rotate>中轴点默认情况下是View的中心点(有待验证貌似是左上角)。

在代码中加载xml中定义的动画:

Animation animation = AnimationUtils.loadAnimation(this, R.anim.view1);
button.startAnimation(animation); 

使用Animation的setAnimationListener方法可以给View动画添加监听。

7.1.2 自定义View动画

原理:继承Animation这个抽象类,然后重写它的initialize和applyTransformation方法,在initialize中做初始化,在applyTransformation中进行相应的矩阵变换即可。通常采用camera来简化矩阵变换的过程。自定义View动画的过程主要就是矩阵变换的过程。例子可参考APIDEMO中的Rotate3dAnimation效果。

7.1.3 帧动画

帧动画其实就是顺序播放一组预先定义好的图片。通过AnimationDrawable来使用帧动画。XML格式语法如下:

<?xml version="1.0" encoding="utf-8" ?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true|false">
<item android:drawable="@mipmap/ic_launcher" android:duration="500"/>
<item android:drawable="@mipmap/ic_launcher" android:duration="500"/>
<item android:drawable="@mipmap/ic_launcher" android:duration="500"/>
</animation-list> 

使用时直接作为View的背景并通过Drawable来播放即可。

button.setBackgroundResource(R.drawable.view2);
AnimationDrawable drawable=(AnimationDrawable)button.getBackground();
drawable.start(); 

7.2 View动画的特殊使用场景

7.2.1 LayoutAnimation

作用于ViewGroup,为ViewGroup指定一个动画,这样当它的子元素出场时都会具有这种动画效果。

步骤:

(1)定义LayoutAnimation

<?xml version="1.0" encoding="utf-8" ?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="0.5"
android:animationOrder="normal"
android:animation="@anim/anim_item"/> 

android:delay 子元素开始动画的时间延迟,例如子元素设置duration为200ms,则0.5表示每个子元素都需要延迟100ms开能开始播放动画,即第一个经过100ms开始播放,第二个就得经过200ms开始播放,第三个就得经过300ms开始播放,以此类推。

android:animationOrder 子元素动画顺序,normal(顺序显示),reverse(逆向显示),random(随机)。

(2)为子元素指定动画

<?xml version="1.0" encoding="utf-8" ?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:interpolator="@android:anim/accelerate_interpolator"
android:shareInterpolator="true">
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0" />
<translate
android:fromXDelta="500"
android:toYDelta="0" />
</set> 

(3)为ViewGroup指定android:layoutAnimation属性

android:layoutAnimation="@anim/anim_layout" 

或者通过LayoutAnimationController来为ViewGroup指定动画。

Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_item);

LayoutAnimationController controller=new LayoutAnimationController(animation);
controller.setDelay(0.5f);
controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
linearlayout.setLayoutAnimation(controller); 

7.2.2 Activity的切换效果

使用overridePendingTransition(int enterAnim, int exitAnim)方法,注意这个方法必须在startActivity或者finish之后被调用才能生效。

enterAnim——Activity被打开时的动画

exitAnim——Activity退出时的动画

启动Activity:

Intent intent =new Intent(this,TestActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.enter_anim,R.anim.exit_anim); 

退出Activity:

@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.enter_anim,R.anim.exit_anim);
} 

7.3 属性动画

API等级必须大于等于11,存放路径为res/animator/目录下,属性动画可以对任何对象做动画,常见的有ValueAnimator、ObjectAnimator。

7.3.1 使用属性动画

属性动画默认时间间隔为300ms,默认帧率为10ms/帧,可以达到在一个时间间隔内完成对象从一个属性值到另一个属性值的改变。如果想要属性动画兼容低版本系统,需要使用NineOldAndroids这个开源动画库。

举例说明如何使用属性动画:

(1)改变一个对象的translationY属性,让其沿着Y轴向上平移一段距离:它的高度。
ObjectAnimator.ofFloat(myObject,"translationY",-myObject.getHeight());

(2)改变一个View的背景色,让其背景色在3秒内实现用0xFFFF8080到0xFF8080FF的渐变,动画无限循环并加反转效果。

ValueAnimator colorAnim=ObjectAnimator.ofInt(this,"backgroundColor",0xFFFF8080,0xFF8080FF);
colorAnim.setDuration(3000);
colorAnim.setEvaluator(new ArgbEvaluator());
colorAnim.setRepeatCount(ValueAnimator.INFINITE);
colorAnim.setRepeatMode(ValueAnimator.REVERSE);
colorAnim.start(); 

属性动画的XML格式语法如下:

<?xml version="1.0" encoding="utf-8" ?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially|together"><!--together:子动画同时播放。sequentially:自动化按照先后顺序依次播放-->
<objectAnimator
android:duration="int"<!--动画时长-->
android:propertyName="string"<!--属性名称-->
android:repeatCount="int"<!--重复次数-->
android:repeatMode="restart|reverse"<!--重复模式-->
android:startOffset="int"<!--延迟时间-->
android:valueFrom="float|int|color"<!--属性起始值-->
android:valueTo="float|int|color"<!--属性结束值-->
android:valueType="colorType|intType|floatType|pathType" /><!--属性类型-->
<animator
android:duration="int"
android:repeatCount="int"
android:repeatMode="restart|reverse"
android:startOffset="int"
android:valueFrom="float|int|color"
android:valueTo="float|int|color"
android:valueType="colorType|intType|floatType|pathType" />
</set> 

android:repeatCount 动画的循环次数,默认为0,-1为无限循环;

android:repeatMode repeat:连续重复;reverse:逆向重复(第一次播放完后,第二次倒着播放,第三次在重头开始播如此反复)。

在XML中定义好属性动画后在java代码中就可以使用了

AnimatorSet set=(AnimatorSet) AnimatorInflater.loadAnimator(context,R.anim.property_animator);
set.setTarget(button);
set.start(); 

实际开发中建议使用代码来实现属性动画,不要使用xml的方式。

7.3.2 理解插值器和估值器

插值器:根据时间流逝的百分比来计算出当前属性值改变的百分比;

估值器:根据当前属性的百分比来计算改变后的属性值。

7.3.3 属性动画监听器

AnimatorListener监听动画的开始、结束、取消、重复播放;

AnimatorUpdateListener 监听整个动画过程。

7.3.4 对任意属性做动画

对object的属性abc做动画,如果想让动画生效需要满足一下两个条件:

(1)object必须要提供setAbc方法,如果动画的时候没有传递初始值,那么还得提供getAbc方法,否则程序直接crash;

(2)object的setAbc对属性abc所做的改变必须能够通过某种方法反映出来,比如带来UI的改变。

如何给一个原始对象添加动画可参见p285页的方法2;

7.3.5 属性动画的工作原理

属性动画要求动画作用的对象提供该属性的set方法,属性动画根据你传递的该属性的初始值和最终值,以及动画的效果多次去掉用set方法。每次 传递给set方法的值都是不一样的,确切来说是随着时间的推移,所传递的值越来越接近最终值。如果动画的时候没有传递初始值,那么还要提供get方法,因 为系统要去获取属性的初始值。

7.4 使用动画的注意事项

注 意View动画是对View的影像做动画,并不是真正改变View的状态,因此有时候会出现动画完成后View无法隐藏的现象,即 setVisibility(View.GONE)失效了,这个时候只要调用view.clearAnimation()清除View动画即可解决此问 题。

将View移动(平移)后,在Android3.0以前的系统上,不管是View动画还是属性动画,新位置均无法触发单击事件,同时,老位置仍 然可以触发单击事件。尽管View已经在视觉上不存在了,将View移回原位置以后,原位置的单击事件继续生效。从3.0开始,属性动画的单击事件触发位 置为移动后的位置,但是View动画仍然在原位置。

关于Android开发艺术探索学习笔记(七)就给大家介绍这么多,后续还会持续更新android艺术探索相关知识,请大家持续关注本站,谢谢。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android艺术探索
,以便于您获取更多的相关知识。

时间: 2024-10-25 23:05:13

Android开发艺术探索学习笔记(七)_Android的相关文章

Android开发艺术探索学习笔记(七)

第七章 Android动画深入分析 Android的动画分为三种:View动画,帧动画,属性动画.帧动画属于View动画. 7.1 View动画 View动画的作用对象是View,共有四种动画效果:平移(Translate),缩放(Scale),旋转(Rotate),透明度(Alpha). 7.1.1 View动画的种类 View动画的保存路径:res/anim/filename.xml.XML格式语法如下: <?xml version="1.0" encoding="

Android开发艺术探索——第七章:Android动画深入分析

Android开发艺术探索--第七章:Android动画深入分析 Android的动画可以分成三种,view动画,帧动画,还有属性动画,其实帧动画也是属于view动画的一种,,只不过他和传统的平移之类的动画不太一样的是表现形式上有点不一样,view动画是通过对场景的不断图像交换而产生的动画效果,而帧动画就是播放一大段图片,很显然,图片多了会OOM,属性动画通过动态的改变对象的属性达到动画效果,也是api11的新特性,在低版本无法使用属性动画,但是我们依旧有一些兼容库,OK,我们还是继续来看下详细

Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式

Android开发艺术探索笔记--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activity搬上来了,也确实,和Activity打交道的次数基本上是最多的,而且他的内容和知识点也是很多的,非常值得我们优先把他掌握,Activity中文翻译过来就是"活动"的意思,但是主席觉得这样翻译有些生硬,直接翻译成"界面"可能更好,的确,Activity主要也是用于U

Android开发艺术探索——新的征程,程序人生路漫漫!

Android开发艺术探索--新的征程,程序人生路漫漫! 偶尔写点东西分享,但是我还是比较喜欢写笔记,看书,群英传看完了,是学到了点东西,开始看这本更加深入Android的书籍了,不知道适不适合自己,先看吧,不过计划也不会这么快,先写篇博客记录一下,因为到真正看书的时间段中间,还会写点Git和重新学一遍JAVA的博客,可能有些人需要,也有些人不需要,但是我还是挺需要的,断片的毛病得改改,老是记不住东西,这书我会看的很细腻,分析的很详细,所以各位看官,可以小小的期待一下! 第1章 Activity

Android开发艺术探索——第二章:IPC机制(中)

Android开发艺术探索--第二章:IPC机制(中) 好的,我们继续来了解IPC机制,在上篇我们可能就是把理论的知识写完了,然后现在基本上是可以实战了. 一.Android中的IPC方式 本节我们开始详细的分析各中跨进程的方式,具体方式有很多,比如可以通过在Intent中附加extras来传递消息,或者通过共享文件的方式来共享数据,还可以采用Binder方式来跨进程通信,另外,ContentProvider天生就是支持扩进程访问的,所以通过Socket也可以实现IPC,上述的各种方法都能实现I

Android开发艺术探索——第二章:IPC机制(上)

Android开发艺术探索--第二章:IPC机制(上) 本章主要讲解Android的IPC机制,首先介绍Android中的多进程概念以及多进程开发模式中常见的注意事项,接着介绍Android中的序列化机制和Binder,然后详细的介绍Bundle,文件共享,AIDL,Messenger,ContentProvider和Socker等进程间通讯的方法,为了更好的使用AIDL进行进程间通讯,本章引入了Binder连接池的概念,最后,本章讲解各种进程间通信方式的优缺点和使用场景,通过本章,可以让读者对

Android开发艺术探索第五章——理解RemoteViews

Android开发艺术探索第五章--理解RemoteViews 这门课的重心在于RemoteViews,RemoteViews可以理解为一种远程的View,其实他和远程的Service是一样的,RemoteViews表示的是一种View的结构,他可以在其他的进程中显示,最常用的就是通知栏和桌面小组件了,我们接下来就细细的品味一下吧! 一.RemoteViews的应用 RemoteViews在实际的开发中,就是通知栏和桌面小组件了,这个大家应该都不陌生,主要是通过NotificationManag

Android开发艺术探索第六章——Android的Drawable

Android开发艺术探索第六章--Android的Drawable 这本书的涉及面真的很抓重点,这章说的是Drawable,Drawable表示的是一种可以在Canvas上进行绘制的抽象概念,Drawable可不光是指图片,其实他的种类也特别繁多,在实际开发当中,他使用简单,而且对大小,效率都有不错的效果,所以是我们不可或缺的一个知识点,我们接下来就来聊聊Drawable给我们带来了哪些好处! 一.Drawable的简介 在Android中,Drawable可不是单单的图片那么简单,他说直观点

Android自定义控件之开关按钮学习笔记分享_Android

今天来讲讲自定义单个控件,就拿开关按钮来讲讲,相信大家见了非常多这样的了,先看看效果: 我们可以看到一个很常见的开关按钮,那就来分析分析. 首先: 这是由两张图片构成: ①一张为有开和关的背景图片 ②一张为控制开和关的滑动按钮 第一步: 写个类继承View,并重写几个方法: 第一个为构造函数,重写一个参数的函数和两个参数的函数就够了,因为两个参数的函数能够使用自定义属性 第二个为控制控件的大小–>protected void onMeasure(int widthMeasureSpec, int