目录介绍

  • 4.0.0.1 Android中有哪几种类型的动画,属性动画和补间动画有何区别?补间动画和属性动画常用的有哪些?
  • 4.0.0.2 View动画为何不能真正改变View的位置?而属性动画为何可以?属性动画是如何改变View的属性?
  • 4.0.0.3 补间动画是如何作用于view的,从源码角度分析以下?为何说补间动画没有改变View的属性?
  • 4.0.0.6 属性动画插值器和估值器的作用?插值器和估值器分别是如何更改动画的?
  • 4.0.0.7 使用动画会出现哪些问题?动画占用大量内存,如何优化?使用动画的注意事项有哪些?

好消息

  • 博客笔记大汇总【15年10月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计500篇[近100万字],将会陆续发表到网上,转载请注明出处,谢谢!
  • 链接地址:https://github.com/yangchong2...
  • 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议,万事起于忽微,量变引起质变!所有的笔记将会更新到GitHub上,同时保持更新,欢迎同行提出或者push不同的看法或者笔记!

4.0.0.1 Android中有哪几种类型的动画,属性动画和补间动画有何区别?

  • 常见三类动画

    • View动画(View Animation)/补间动画(Tween animation):对View进行平移、缩放、旋转和透明度变化的动画,不能真正的改变view的位置。应用如布局动画、Activity切换动画
    • 逐帧动画(Drawable Animation):是View动画的一种,它会按照顺序播放一组预先定义好的图片
    • 属性动画(Property Animation):对该类对象进行动画操作,真正改变了对象的属性
  • 属性动画和补间动画区别

    • 属性动画才是真正的实现了view的移动,补间动画对view的移动更像是在不同地方绘制了一个影子,实际对象还是处于原来的地方。当动画的repeatCount设置为无限循环时,如果在Activity退出时没有及时将动画停止,属性动画会导致Activity 无法释放而导致内存泄漏,而补间动画却没问题。xml文件实现的补间动画,复用率极高。在 Activity切换,窗口弹出时等情景中有着很好的效果。
    • 补间动画还有一个致命的缺陷,就是它只是改变了View的显示效果而已,而不会真正去改变View的属性。什么意思呢?比如说,现在屏幕的左上角有一个按钮,然后我们通过补间动画将它移动到了屏幕的右下角,现在你可以去尝试点击一下这个按钮,点击事件是绝对不会触发的,因为实际上这个按钮还是停留在屏幕的左上角,只不过补间动画将这个按钮绘制到了屏幕的右下角而已。下面这张图摘自网络!
  • 补间动画和帧动画xml文件存放的位置

    • 补间动画是放置到res/anim/下面
    • 帧动画是放置到res/drawable/下面,子节点为animation-list,在这里定义要显示的图片和每张图片的显示时长
  • 补间动画和属性动画常用的有哪些?技术博客大总结

    • View动画框架是旧的框架,只能用于Views。比较容易设置和能满足许多应用程序的需要。View动画框架中一共提供了AlphaAnimation(透明度动画)、RotateAnimation(旋转动画)、ScaleAnimation(缩放动画)、TranslateAnimation(平移动画)四种类型的补间动画;并且View动画框架还提供了动画集合类(AnimationSet),通过动画集合类(AnimationSet)可以将多个补间动画以组合的形式显示出来。
    • 与属性动画相比View动画存在一个缺陷,View动画改变的只是View的显示,而没有改变View的响应区域,并且View动画只能对View做四种类型的补间动画。因此Google在Android3.0(API级别11)及其后续版本中添加了属性动画框架,从名称中就可以知道只要某个类具有属性(即该类含有某个字段的set和get方法),那么属性动画框架就可以对该类的对象进行动画操作(其实就是通过反射技术来获取和执行属性的get,set方法),同样属性动画框架还提供了动画集合类(AnimatorSet),通过动画集合类(AnimatorSet)可以将多个属性动画以组合的形式显示出来。

4.0.0.2 View动画为何不能真正改变View的位置?而属性动画为何可以?属性动画是如何改变View的属性?

  • View动画为何不能真正改变View的位置?而属性动画为何可以?

    • View动画改变的只是View的显示,而没有改变View的响应区域;而属性动画会通过反射技术来获取和执行属性的get、set方法,从而改变了对象位置的属性值。
    • Animation产生的动画数据实际并不是应用在View本身的,而是应用在RenderNode或者Canvas上的,这就是为什么Animation不会改变View的属性的根本所在。
  • 属性动画是如何改变View的属性?

    • 具体看我这篇博客:https://www.jianshu.com/p/4af...

4.0.0.3 补间动画是如何作用于view的,从源码角度分析以下?为何说补间动画没有改变View的属性?

  • 关于补间动画原理

    • 要了解Android动画是如何加载出来的,我们首先要了解Android View 是如何组织在一起的.每个窗口是一颗View树. RootView是DecorView,在布局文件中声明的布局都是DecorView的子View.是通过setContentView来设置进入窗口内容的. 因为View的布局就是一棵树.所以绘制的时候也是按照树形结构来遍历每个View进行绘制.ViewRoot.java中 draw函数准备好Canvas后 调用 mView.draw(canvas),这里的mView是DecorView.
    • 下面看一下递归绘制的几个步骤:技术博客大总结
    • 1.绘制背景
    • 2.如果需要,保存画布(canvas),为淡入淡出做准备
    • 3.通过调用View.onDraw(canvas)绘制View本身的内容
    • 4.通过 dispatchDraw(canvas)绘制自己的孩子,dispatchDraw->drawChild->child.draw(canvas) 这样的调用过程被用来保证每个子 View 的 draw 函数都被调用
    • 5.如果需要,绘制淡入淡出相关的内容并恢复保存的画布所在的层(layer)
    • 6.绘制修饰的内容(例如滚动条)
    • 当一个 ChildView 要重画时,它会调用其成员函数 invalidate() 函数将通知其 ParentView 这个 ChildView 要重画,这个过程一直向上遍历到 ViewRoot,当 ViewRoot 收到这个通知后就会调用上面提到的 ViewRoot 中的 draw 函数从而完成绘制。Android 动画就是通过 ParentView 来不断调整 ChildView 的画布坐标系来实现的
  • 如何计算补间动画数据

    • 首先进入Animation类,然后找到getTransformation方法,主要是分析这个方法逻辑,如图所示

    • 那么这个方法中做了什么呢?Animation在其getTransformation函数被调用时会计算一帧动画数据,而上面这些属性基本都是在计算动画数据时有相关的作用。
    • 第一步:若startTime为START_ON_FIRST_FRAME(值为-1)时,将startTime设定为curTime
    • 第二步:计算当前动画进度:

      • normalizedTime = (curTime - (startTime + startOffset))/duration
      • 若mFillEnabled==false:将normalisedTime夹逼至[0.0f, 1.0f]
    • 第三步:判断是否需要计算动画数据:

      • 若normalisedTime在[0.0f, 1.0f],需计算动画数据
      • 若normalisedTime不在[0.0f, 1.0f]:

        • normalisedTime<0.0f, 仅当mFillBefore==true时才计算动画数据
        • normalisedTime>1.0f, 仅当mFillAfter==true时才计算动画数据
    • 第四步:若需需要计算动画数据:

      • 若当前为第一帧动画,触发mListener.onAnimationStart
      • 若mFillEnabled==false:将normalisedTime夹逼至[0.0f, 1.0f]
      • 根据插间器mInterpolator调整动画进度:
      • interpolatedTime = mInterpolator.getInterpolation(normalizedTime)
      • 若动画反转标志位mCycleFlip为true,则
      • interpolatedTime = 1.0 - normalizedTime
      • 调用动画更新函数applyTransformation(interpolatedTime, transformation)计算出动画数据
    • 第五步:若夹逼之前normalisedTime大于1.0f, 则判断是否需继续执行动画:

      • 已执行次数mRepeatCount等于需执行次数mRepeated

        • 若未触发mListener.onAnimationEnd,则触发之
      • 已执行次数mRepeatCount不等于需执行次数mRepeated技术博客大总结

        • 自增mRepeatCount
        • 重置mStartTime为-1
        • 若mRepeatMode为REVERSE,则取反mCycleFlip
        • 触发mListener.onAnimationRepeat

4.0.0.6 属性动画插值器和估值器的作用?插值器和估值器分别是如何更改动画的?

  • 插值器(Interpolator):根据时间流逝的百分比计算出当前属性值改变的百分比。确定了动画效果变化的模式,如匀速变化、加速变化等等。View动画和属性动画均可使用。常用的系统内置插值器:

    • 线性插值器(LinearInterpolator):匀速动画
    • 加速减速插值器(AccelerateDecelerateInterpolator):动画两头慢中间快
    • 减速插值器(DecelerateInterpolator):动画越来越慢
  • 类型估值器(TypeEvaluator):根据当前属性改变的百分比计算出改变后的属性值。针对于属性动画,View动画不需要类型估值器。常用的系统内置的估值器:技术博客大总结

    • 整形估值器(IntEvaluator)
    • 浮点型估值器(FloatEvaluator)
    • Color属性估值器(ArgbEvaluator)

4.0.0.7 使用动画会出现哪些问题?动画占用大量内存,如何优化?使用动画的注意事项有哪些?

  • 使用动画会出现哪些问题?

    • OOM问题:这个问题主要出现在帧动画中,当图片数量较多且图片较大时就极易出现OOM,这个在实际开发中要尤其注意,尽量避免使用帧动画。
    • 内存泄露:在属性动画中有一类无限循环的动画,这类动画需要在Activity退出时及时停止,否则将导致Activity无法释放从而造成内存泄露,通过验证后发现View动画并不存在此问题。
  • 动画占用大量内存,如何优化?
  • 使用动画的注意事项有哪些?

    • OOM问题:这个问题主要出现在帧动画中,当图片数量较多且图片较大时就极易出现OOM,这个在实际开发中要尤其注意,尽量避免使用帧动画。
    • 内存泄露:在属性动画中有一类无限循环的动画,这类动画需要在Activity退出时及时停止,否则将导致Activity无法释放从而造成内存泄露,通过验证后发现View动画并不存在此问题。
    • 兼容性问题:动画在3.0以下的系统有兼容性问题,在某些特殊场景可能无法正常工作,因此要做好适配工作。
    • View动画的问题:View动画是对View的影像做动画,并不是真正改变View的状态,因此有时候会出现动画完成后View无法隐藏的现象,即setVisibility(View.GOEN)失效了,这个时候只要调用view.clearAnimation()清除View动画即可解决问题。技术博客大总结
    • 不要使用px:在进行动画的过程中,要尽量使用dp,使用px会导致在不用的设备上有不用的效果。
    • 动画元素的交互:从3.0开始,将view移动(平移)后,属性动画的单击事件触发位置为移动后的位置,但是View动画仍然在原位置。在Android3.0以前的系统中,不管是View动画还是属性动画,新位置都无法触发单击事件同时,老位置仍然能触发单击事件(因为属性动画在Android3.0以前是没有的,是通过兼容包实现的,底层也是调用View动画)。
    • 硬件加速:使用动画的过程中,建议开启硬件加速,这样会提高动画的流畅性。
    • 开启方法:
    • 在你的Android manifest文件,添加hardwareAccelerated属性就可以了。可以给整个application添加,也可以单独给一个acitivty添加,该属性默认值为false;

关于其他内容介绍

01.关于博客汇总链接

  • 1.技术博客汇总
  • 2.开源项目汇总
  • 3.生活博客汇总
  • 4.喜马拉雅音频汇总
  • 5.其他汇总

02.关于我的博客

  • 我的个人站点:www.yczbj.org, www.ycbjie.cn
  • github:https://github.com/yangchong211
  • 知乎:https://www.zhihu.com/people/...
  • 简书:http://www.jianshu.com/u/b7b2...
  • csdn:http://my.csdn.net/m0_37700275
  • 喜马拉雅听书:http://www.ximalaya.com/zhubo...
  • 开源中国:https://my.oschina.net/zbj161...
  • 泡在网上的日子:http://www.jcodecraeer.com/me...
  • 邮箱:yangchong211@163.com
  • 阿里云博客:https://yq.aliyun.com/users/a... 239.headeruserinfo.3.dT4bcV
  • segmentfault头条:https://segmentfault.com/u/xi...
  • 掘金:https://juejin.im/user/593943...

04.Android之动画问题相关推荐

  1. android logo:内核、android开机动画

    android logo:内核.android开机动画 关键词:android 开机logo  开机动画 initlogo.rle   bootanimation  desc.txt 平台信息: 内核 ...

  2. Android:Android开机动画

    Android系统的开机画面显示过程分析 三个开机画面修改方式:目录 DIY固件系列教程--实现开机LOGO三屏动画的完全替换 一.第一个开机画面是在内核启动的过程中出现的,它是一个静态的画面 二.第 ...

  3. android 自定义loading,Android自定义动画-StarLoadingView

    今天来分享第二个自定义loading的动画,起了个名字叫 蹦跶的星星 ,还是老规矩先介绍,后上图. 实现效果在最后,GIF有点大,手机流量慎重. 介绍 首先声明做这个动画的初衷是为了学习和分享,所以从 ...

  4. android 三维动画效果,9款令人惊叹的HTML5 3D动画应用

    原标题:9款令人惊叹的HTML5 3D动画应用 之前我们已经向大家分享了很多HTML5动画应用了,大部分都非常炫酷,也有一小部分是很实用的.今天我们要向各位HTML5动画爱好者介绍更多的HTML5 3 ...

  5. 【学习笔记】Android视图动画学习

    2019独角兽企业重金招聘Python工程师标准>>> 1.Android View动画框架 Animation框架定义了透明度.旋转.缩放和位移几种常见的动画. 实现原理:每次绘制 ...

  6. android矢量动画 充电,android矢量动画

    android矢量动画! 直接来个例子就明白了!(这里我把与动画无关的属性都用-表示) 首先你要有个矢量图 比如这个矢量图xml文件叫"vector1",文件在res\drawab ...

  7. Android视图动画集合AndoridViewAnimations

    Android视图动画集合AndoridViewAnimations Android视图动画是针对视图对象的动画效果,包括对象平移.旋转.缩放和渐变四种类型.通过组合这四种类型,可以创建出无数种动画效 ...

  8. 使用android frame动画定义自己的ProgressBar

    使用android  frame动画定义自己的ProgressBar 在 res  /layout/ainm 目录下面建一个frame_ainm.xml文件 <?xml version=&quo ...

  9. android动画封装,Android属性动画封装,快速构建动画

    Android实现动画效果的方式主要有帧动画.补间动画.属性动画.关于安桌动画的基础知识可以查看这篇文章Android属性动画完全解析 这里我要讲的是如何快速构建出一个动画效果,如下图: 如果我们用属 ...

最新文章

  1. LaTeX技巧 twocolumn 双栏
  2. Jmeter连接到Mysql
  3. 穿越剧_张宇鑫:穿越剧——从皇帝到乞丐
  4. python操纵excel的方法_python操作Excel的几种方式
  5. 时间序列分析 lstm_LSTM —时间序列分析
  6. Android开源源码推荐(一)
  7. 加分二叉树(洛谷-P1040)
  8. 构建执法阅读笔记06(总结)
  9. Python xrange()函数
  10. strcat第二个参数变吗_您能解决这3个(看似)简单的Python问题吗?
  11. 分享15款很棒的 JavaScript 开发工具
  12. 西门子g120变频器接线图_西门子G120变频器怎么样?好用吗?
  13. python分组统计excel数据_python中excel数据分组处理
  14. sl4a最新版下载_SL4A Script Launcher
  15. 中通快递 | 快递单号查询API
  16. 物联网python开发实践
  17. strongSwan之ipsec.secrets配置手册
  18. centos7常用命令详解
  19. java-简单二维码制作
  20. SOA系列之 什么是SOA?

热门文章

  1. Unity3D之如何创建正确的像素比在屏幕上
  2. 用ACL 对Dos***进行分类的示例
  3. Android的虚拟机Dalvik 介绍
  4. 高可用集群HA之双机集群
  5. linux 如何判断当前用户
  6. java压缩与解压缩
  7. NTLDR is missing Press any key to restart
  8. 从一个表复制到另一个表SQL
  9. 设计模式 (一) 初次体验
  10. ipfs-hdfs分布式文件系统