Android 开发艺术探索笔记(16)

插值器和估值器
TimeInterpolator中文翻译为时间插值器,它的作用是根据时间流逝的百分比来计算出当前属性改变的百分比。系统预置了一些插值器(线性插值器,加减速插值器等)。
TypeEvaluator的中文翻译为类型估值算法,也叫估值器,它的作用是根据当前属性改变的百分比来计算改变后的属性值。系统也预置了一些估值器。
插值器和估值器的作用是让动画进行非匀速运动。

这里写图片描述
这是一组动画从0到40ms完成的一个匀速动画,这时候我们要去修改这个动画变成非匀速动画。
动画的默认刷新率是10ms/帧,所以动画有5帧,以第三帧 x=20来说,时间流逝的百分比是50%(20/40=0.5),意味时间过了一半。那x应该改变多少呢?这个就要有插值器和估值器来进行确定。一般情况下的插值器是线性插值器,当时间流逝一半时,x的改变也是一半,所以是0.5,所以线性插值器实现的是匀速动画。
这里写图片描述
这里是线性插值器(LinearInterpolator)的源码,可以看到getInterpolation中返回的值和输入的值一样,当返回值是0.5,说明输入值也是0.5。而x具体变成具体什么值,就要看估值器。
这里写图片描述
evaluate方法中的三个参数为估值小数,一个为起始值,一个为结束值。对应t=20ms的例子来说就是evaluate(0.5,20,40),返回得值为20,所以x=20,这就是由来。
由代码又知道,我们可以通过去实现接口Interpolator和TypeEvaluator来自定义插值器和估值器。

属性动画监听器
属性动画提供了监听器用于监听动画的播放过程。主要有如下两个接口:
AnimatorUpdateListener和AnimatorListener。
AnimatorListener可以监听动画的开始、结束、取消和重复播放。
AnimatorUpdateListener会监听整个动画过程,即每走一帧,就会监听一帧。

对任意属性做动画
属性动画要求动画作用的对象提供该属性的get和set方法,属性动画根据外界传递的该属性的初始值和最终值,以动画的效果多次去执行set方法。每次传给set方法的值都不一样,随着时间推移,这个值将越来越接近最终值。所以我们对object的属性abc做动画,如果想让动画生效,要同时满足两个条件:
(1)object必须要提供setAbc方法,如果动画没有提供初始值,还要提供getAbc方法。
(2)object的setAbc对属性abc所做的改变必须能够通过某种方法反映出来,比如会带来UI的改变之类的(否则动画无效果但不会crash)。
比如我们给以一个button来加一个变宽的动画,button的getWidth能够得到width,但是setWidth却不能改变width,因为在button继承的TextView中的setWidth是设置最小宽度和最大宽度,所以满足了第一个条件没有满足第二个条件。解决方法有:
(1)如果你有权限就给你的属性加上set和get方法。
(2)用一个类来包装原始对象,间接为其提供get和set方法。
(3)采用ValueAnimator,监听动画过程,自己实现属性改变。

属性动画的工作原理
这里就不贴源码了,其实很简单,就是判断先将当前动画、等待动画、延迟动画中有和当前动画相同的动画,则将其取消,最后将当前动画start。

使用动画的注意事项

  • OOM
    帧动画中出现了大量的尺寸过大的图片
  • 内存泄漏
    有些动画会无限循环,所以要在Activity退出时及时停止。
  • 兼容性问题
  • View动画问题
    View动画是对动画做影像动画,并没真正改变View的状态
  • 不要使用px
  • 动画元素的交互
    属性动画的单击事件触发在移动后的位置,View则在之前的位置。
  • 硬件加速
    使用动画的过程中尽量使用硬件加速,能保证动画的平滑和流畅性。

理解Window和WindowManager

Window是一个窗口,Window的具体实现位于WindowManagerService中,WindowManager可以管理Window,并以IPC的形式与WindowManagerService交互。
首先使用WindowManager来添加一个Window,代码如下:
这里写图片描述
这里写图片描述
上述的代码将一个Button添加屏幕的(100,300)坐标上。
WindowManager.LayoutParams中的flags和type这两个参数比较重要。
下面是几个重要的flags:
这里写图片描述
Type参数表示的是Window的类型,有三种,分别是应用Window,子Window和系统Window。
应用类Window对应着一个Activity,子Window不能单独存在,它需要附属在父Window中,比如常见的Dialog就是子Window。系统Window就是需要声明权限才能创建的Window,比如Toast。
它们都有分层,大的级别在上面,Window的范围是1-99,子Window是1000-1999,系统则是2000-2999,可以通过LayoutParams的的type设置。
WindowManager的功能比较简单,就是添加View、更新View、删除View。这三个方法都定义在接口ViewManager中。而WindowManager继承了ViewManager。

Window的内部机制
每一个Window都对应着一个View和一个ViewRootImpl,Window和View通过ViewRootImpl来建立联系,因此View实际上是不存在的,它是以View的形式存在。实际中无法直接应用Window,要通过WindowManager。

  • Window的添加
    通过WindowManager的addView来实现。WindowManager是一个接口,它真正实现的是WindowManagerImpl类。在这个类中Window的三大操作如下:
    这里写图片描述
    可以看到所有的操作都是交给了WindowManagerGlobal来处理。这是典型的桥接模式。WindowManagerGloabl的addView的源码为:
    这里写图片描述
    这里写图片描述
    这里写图片描述
    上面是创建每个Window所对应的View、每个Window所对应的ViewRootImpl,所有的参数,然后将View添加到这些列表中。
    然后通过ViewRootImpl来更新界面并完成Window的添加过程。
    这个步骤由setView来完成,其内部有requestLayout,用来进行异步刷新。
    最后通过WindowSession来完成Window的创建。实现的类是Session,所以说这是Window的添加是一次IPC调用,它最后是交由WindowManagerService处理,WindowManagerService会为每一个应用保留一个单独的Session。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
官网:http://www.c945.com/d-s/dsure 简介: Dsure基于纯CSS的HTML5网站响应式开发框架,可用于国内/外网站开发,完美适用于Designers Site Program 全站静态系统 来历: Dsure参考了国内/外优秀的框架库,经过仔细研究探讨,针对国内和国外网站开发需求,重构编写了一套更适宜于国内(包括国外)的网站CSS/HTML开发框架,在这里它主要运用于Designers Site Program 全站静态系统的各类高端网站主题开发,当然如果你喜欢,也可以用于其它网站的框架开发 ^_^ 特色: + 兼容IE6+, Firefox, Safari, Opera, Chrome 等主流浏览器,更高效适应国内/外网站 +18种常用色彩方案,灵活运动到各标签元素控件中 +12列自适应百分比网格(栅格)系统,适应各种分辨率和平台 +纯CSS开发框架,基于HTML5+CSS3 +完美兼容个版本的Designers Site Program 全站静态系统 +无任何的Javascript效果代码参与到框架开发中,极大程度方便您自己扩展js组件和插件 +384个常用web矢量图标,icon大小和颜色灵活变更 +丰富的组合样式,按钮控件样式轻松变 模块: 基础框架 (Base) *必须* 样式叠加 (Base) *通用* 内容/文本 (Text) 按钮 (Buttons) 表单 (Forms) 表格 (Tables) 网格/栅格系统 (Grids) 循环列表布局 (Layouts) 图标 (Icons) 图片 (Images) 分割线 (Dividing Line) 分页 (Paginators) 导航菜单 (Navigation) 分类导航 (Classification) 醒目牌 (Striking) 搜索框 (Search Box) 标签集 (Tags) 网页是一门技术,更讲究艺术,没有绝对的山寨与抄袭,更多的,是不断的探索学习和借鉴,国内的设计应该有更多更适应国内需求的探索,因此有了dsure这个CSS开发框架,喜欢的童鞋尽情下载。
Android开发艺术探索》是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。《Android开发艺术探索》从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些知识点;第二,结合Android源代码和应用层开发过程,融会贯通,介绍一些比较深入的知识点;第三,介绍一些核心技术和Android的性能优化思想。 《Android开发艺术探索》侧重于Android知识的体系化和系统工作机制的分析,通过《Android开发艺术探索》的学习可以极大地提高开发者的Android技术水平,从而更加高效地成为高级开发者。而对于高级开发者来说,仍然可以从《Android开发艺术探索》的知识体系中获益。 《Android开发艺术探索》是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。《Android开发艺术探索》从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些知识点;第二,结合Android源代码和应用层开发过程,融会贯通,介绍一些比较深入的知识点;第三,介绍一些核心技术和Android的性能优化思想。, 《 Android开发艺术探索》侧重于Android知识的体系化和系统工作机制的分析,通过《Android开发艺术探索》的学习可以极大地提高开发者的Android技术水平,从而更加高效地成为高级开发者。而对于高级开发者来说,仍然可以从《Android开发艺术探索》的知识体系中获益。
Dsure CSS/HTML5网页开发框架简介: Dsure基于纯CSS的HTML5网站响应式开发框架,可用于国内/外网站开发,完美适用于Designers Site Program 全站静态系统   来历: Dsure参考了国内/外优秀的框架库,经过仔细研究探讨,针对国内和国外网站开发需求,重构编写了一套更适宜于国内(包括国外)的网站CSS/HTML开发框架,在这里它主要运用于Designers Site Program 全站静态系统的各类高端网站主题开发,当然如果你喜欢,也可以用于其它网站的框架开发 ^_^ 由于Dsure是专门针对DS产品和国内/外兼容性灵活建站的开源框架,固暂不提供局部式框架独立包下载,以免造成效果错位。如果您喜欢,可以直接下载完全包,保证您开发功能的齐全。   特色: 兼容IE6 , Firefox, Safari, Opera, Chrome 等主流浏览器,更高效适应国内/外网站 18种常用色彩方案,灵活运动到各标签元素控件中 12列自适应百分比网格(栅格)系统,适应各种分辨率和平台 纯CSS开发框架,基于HTML5 CSS3 完美兼容个版本的Designers Site Program 全站静态系统 无任何的Javascript效果代码参与到框架开发中   模块: 基础框架 (Base) *必须* 样式叠加 (Base) *通用* 内容/文本 (Text) 按钮 (Buttons) 表单 (Forms) 表格 (Tables) 网格/栅格系统 (Grids) 循环列表布局 (Layouts) 图标 (Icons) 图片 (Images) 分割线 (Dividing Line) 分页 (Paginators) 导航菜单 (Navigation) 分类导航 (Classification) 醒目牌 (Striking) 搜索框 (Search Box) 标签集 (Tags)   网页是一门技术,更讲究艺术,没有绝对的山寨与抄袭,更多的,是不断的探索学习和借鉴,国内的设计应该有更多更适应国内需求的探索,因此有了dsure这个CSS开发框架,喜欢的童鞋尽情下载。
本书是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。本书从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些知识点;第二,结合Android源代码和应用层开发过程,融会贯通,介绍一些比较深入的知识点;第三,介绍一些核心技术和Android的性能优化思想。 第1章 Activity的生命周期和启动模式 1 1.1 Activity的生命周期全面分析 1 1.1.1 典型情况下的生命周期分析 2 1.1.2 异常情况下的生命周期分析 8 1.2 Activity的启动模式 16 1.2.1 Activity的LaunchMode 16 1.2.2 Activity的Flags 27 1.3 IntentFilter的匹配规则 28 第2章 IPC机制 35 2.1 Android IPC简介 35 2.2 Android中的多进程模式 36 2.2.1 开启多进程模式 36 2.2.2 多进程模式的运行机制 39 2.3 IPC基础概念介绍 42 2.3.1 Serializable接口 42 2.3.2 Parcelable接口 45 2.3.3 Binder 47 2.4 Android中的IPC方式 61 2.4.1 使用Bundle 61 2.4.2 使用文件共享 62 2.4.3 使用Messenger 65 2.4.4 使用AIDL 71 2.4.5 使用ContentProvider 91 2.4.6 使用Socket 103 2.5 Binder连接池 112 2.6 选用合适的IPC方式 121 第3章 View的事件体系 122 3.1 View基础知识 122 3.1.1 什么是View 123 3.1.2 View的位置参数 123 3.1.3 MotionEvent和TouchSlop 125 3.1.4 VelocityTracker、GestureDetector和Scroller 126 3.2 View的滑动 129 3.2.1 使用scrollTo/scrollBy 129 3.2.2 使用动画 131 3.2.3 改变布局参数 133 3.2.4 各种滑动方式的对比 133 3.3 弹性滑动 135 3.3.1 使用Scroller 136 3.3.2 通过动画 138 3.3.3 使用延时策略 139 3.4 View的事件分发机制 140 3.4.1 点击事件的传递规则 140 3.4.2 事件分发的源码解析 144 3.5 View的滑动冲突 154 3.5.1 常见的滑动冲突场景 155 3.5.2 滑动冲突的处理规则 156 3.5.3 滑动冲突的解决方式 157 第4章 View的工作原理 174 4.1 初识ViewRoot和DecorView 174 4.2 理解MeasureSpec 177 4.2.1 MeasureSpec 177 4.2.2 MeasureSpec和LayoutParams的对应关系 178 4.3 View的工作流程 183 4.3.1 measure过程 183 4.3.2 layout过程 193 4.3.3 draw过程 197 4.4 自定义View 199 4.4.1 自定义View的分类 200 4.4.2 自定义View须知 201 4.4.3 自定义View示例 202 4.4.4 自定义View的思想 217 第5章 理解RemoteViews 218 5.1 RemoteViews的应用 218 5.1.1 RemoteViews在通知栏上的应用 219 5.1.2 RemoteViews在桌面小部件上的应用 221 5.1.3 PendingIntent概述 228 5.2 RemoteViews的内部机制 230 5.3 RemoteViews的意义 239 第6章 Android的Drawable 243 6.1 Drawable简介 243 6.2 Drawable的分类 244 6.2.1 BitmapDrawable 244 6.2.2 ShapeDrawable 247 6.2.3 LayerDrawable 251 6.2.4 StateListDrawable 253 6.2.5 LevelListDrawable 255 6.2.6 TransitionDrawable 256 6.2.7 Ins

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值