Android动画学习总结
来源:互联网 发布:linux 电池驱动 编辑:程序博客网 时间:2024/06/05 18:04
Android动画学习总结
一、Android动画分类:
- View动画:场景里的View不断的做变换(平移、旋转、拉伸、透明度)产生的动画效果;
- 帧动画:按顺序播放一系列图像产生的效果;
- 属性动画:Android3.0开始增加的一种动画效果,通过动态改变View对象的属性值实现。
二、View动画:
View动画分为TranslateAnimation、RotateAnimation、ScaleAnimation、AlphaAnimation四类,每一类都有其各自的属性,具体可以查看官方文档,强烈建议使用XML来定义View动画,简单方便,可读性高,下面说明四类动画在XML中的表现形式:
- TranslateAnimation—
<translate>
- RotateAnimation—
<rotate>
- ScaleAnimation—
<scale>
- AlphaAnimation—
<alpha>
- TranslateAnimation—
下面是View动画的定义://res.anim.customize_anim.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:duration="3000" android:repeatMode="reverse" android:fillAfter="true" android:startOffset="300" android:shareInterpolator="true"> <translate android:fromYDelta="100" android:fromXDelta="100" android:toYDelta="500" android:toXDelta="500" /> <rotate android:fromDegrees="0" android:toDegrees="90" android:pivotX="0" android:pivotY="0" /> <scale android:duration="300" android:fromXScale="2.0" android:fromYScale="2.0" android:pivotX="50%p" android:pivotY="50%p" android:toXScale="1.0" android:toYScale="1.0" /> <alpha android:fromAlpha="0" android:toAlpha="1" /> <set><!--在此定义子动画集--></set></set>
除了四类View动画特有属性外,还有几个公用属性:
- android:duration(动画持续时间)
- android:fillAfter(动画结束后是否停留在结束位置,true:结束位置,false:初始位置)
- android:interpolator(动画插值器)
- android:repeatMode(动画重复模式)
- android:startOffset(动画延迟时间,单位:ms,默认300ms)
- android:shareInterpolator(动画集是否共享插值器)
定义好View动画后,下面就是应用动画了:
Animation animation = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.customize_anim);animation.setAnimationListener(new Animation.AnimationListener() { //监听动画过程 @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } });imageView.startAnimation(animation);
如上,可以对动画添加监听过程。
自定义View动画过程:
a、继承抽象类Animation,重写initialize()、applyTransformation()方法
b、initialize()进行初始化操作
c、applyTransformation()进行相应的矩阵变换实现动画效果,使用Camera可以简化矩阵变换过程帧动画:
系统提供AnimationDrawable来使用动画,因其是顺序播放一组图片来实现动画,特别消耗内存,并且容易引起OOM,所以不建议使用。View动画特殊使用场景
View动画可以应用于ViewGroup场景,用于控制子控件的出场效果,常见的有ListView和Activity的切换效果等,具体实现在此不做详细说明。
三、属性动画
- 属性动画是Api 11加入的新特性,要想兼容Api 11以下版本,可以使用开源库nineoldandroids实现,该开源库的使用和原生的属性动画的使用完全一致。属性动画不再局限于View的变换,它可以实现任意属性值的变化,进而形成动画效果,常用的类有ObjectAnimation、ValueAnimation、AnimationSet等,其中AnimationSet是动画集合,ObjectAnimation是ValueAnimation的子类,属性动画的简单使用示例:
ObjectAnimator animator = ObjectAnimator.ofFloat(imageView,"translationY",200); animator.setRepeatMode(ValueAnimator.RESTART); animator.setRepeatCount(3); animator.setEvaluator(new IntEvaluator()); animator.setInterpolator(new AccelerateDecelerateInterpolator()); animator.start();
- 插值器
- 插值器是根据时间流逝的百分比计算出当前属性值改变的百分比,系统提供LinearInterpolator(线性插值器,匀速动画)、AccelerateDecelerateInterpolator(加减速插值器,根据cos()函数实现)、DecelerateAccerateInterpolator(减加速插值器,根据sin()函数实现)、DecelerateInterpolator(减速插值器)等,可以实现自定义插值器,只需实现TimeInterpolator接口或者Interpolator接口即可。
- 估值器
- 类似于插值器,估值器是根据当前属性值改变的百分比计算出改变后的属性值,系统提供IntEvaluator(Int型属性估值器)、FloatEvaluator(Float型属性估值器)、ArgbEvaluator(颜色属性股指器),估值器同样可以自定义,只需实现TypeEvaluator接口。注:插值器和估值器是实现非匀速动画的重要手段。
- 属性动画监听
- 属性动画提供两种类型的监听,分别是AnimatorListener和AnimatorUpdateListener,AnimatorListener被AnimatorListenerAdapter类适配,可以有选择的实现该接口中的方法。AnimatorUpdateListener用于监听动画中的每一帧动画。
属性动画生效的前提条件:在此我们假设对对象A的width属性实施动画效果
- A对象必须提供setWidth()方法,如果应用时未提供初始值,A还需提供getWidth()方法来获取width的初始值
A的setWidth()方法设置的值必须能够通过某种方式反应出来,比如UI的改变等
以上两个条件必须同时满足,典型案例如Button的width,只满足第一个条件,想要详细了解请见Button的源码getWidth()、setWidth();
当条件不满足的解决办法,官方提供如下三种:- 权限允许的情况下,为A加上get和set方法,基本上不被使用,A大多数来自SDK
- 包装A类,为其提供get和set方法,用的比较多,示例如下
- 使用ValueAnimator,监听动画过程
private static class ViewWrapper{ private View mTarget; public ViewWrapper(View mTarget) { this.mTarget = mTarget; } public int getWidth(){ return mTarget.getLayoutParams().width; } public void setWidth(int width){ mTarget.getLayoutParams().width = width; mTarget.requestLayout(); } } //使用包装类 ViewWrapper viewWrapper = new ViewWrapper(textView3); ObjectAnimator animator = ObjectAnimator.ofInt(viewWrapper,"width",50,500); animator.setDuration(5000); animator.start();
四、文章说明
本篇文章是自己对Android动画的学习总结,为了记忆,也为了后面使用方便,如有不对之处,欢迎阅览者提出,在此感谢任志刚老师的《Android开发艺术探索》
- Android动画学习总结
- Android动画学习总结
- Android 动画学习总结
- Android动画学习总结---上
- Android动画学习总结---中
- Android动画学习总结---下
- Android 动画总结-Layout动画
- Android 动画总结-帧动画
- Android 动画总结-属性动画
- Android 动画总结-矢量动画
- iOS学习动画总结
- QML动画------学习总结
- 属性动画学习总结
- 学习总结--属性动画
- Android学习笔记:根据系列图片绘制动画总结
- Android动画学习总结(二)-------view animation
- Android动画学习总结(一)------- 分类区别
- Android动画学习总结(三)------- property animation
- 信号与系统学习笔记1——离散时间复指数序列的周期性质
- Android Studio不显示logcat日志的解决办法
- 在解压tar.gz文件的时候报错
- Android MVVM结合DataBinding的简单实用(Android studio)及自己遇到的坑
- RNA_Seq差异表达分析流程
- Android动画学习总结
- 自动筛选的逻辑(6)-对可见单元“写”数据
- iOS 探讨之 HTTP MIME Content-Type
- 您应该知道的UNIX工具系列之2:Netcat
- 通过Hibernate操纵对象(下)
- POJ3117——World Cup
- 简单粗暴:使用pycharm安装对应的Python版本第三方包
- lvs(+keepalived)、haproxy(+heartbeat)、nginx 负载均衡的比较分析
- 文件下载功能