有些动画会无限循环,所以要在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来建立联系 Android开源项目《ali1024.coding.net/public/P7/Android/git》 ,因此View实际上是不存在的,它是以View的形式存在。实际中无法直接应用Window,要通过WindowManager。
- Window的添加
通过WindowManager的addView来实现。WindowManager是一个接口,它真正实现的是WindowManagerImpl类。在这个类中Window的三大操作如下:
可以看到所有的操作都是交给了WindowManagerGlobal来处理。这是典型的桥接模式。WindowManagerGloabl的addView的源码为:

上面是创建每个Window所对应的View、每个Window所对应的ViewRootImpl,所有的参数,然后将View添加到这些列表中。
然后通过ViewRootImpl来更新界面并完成Window的添加过程。
这个步骤由setView来完成,其内部有requestLayout,用来进行异步刷新。
总结
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的Android开发中高级必知必会核心笔记,共计2968页PDF、58w字,囊括Android开发648个知识点,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
2021年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。
虽然面试失败了,但我也不会放弃入职字节跳动的决心的!建议大家面试之前都要有充分的准备,顺顺利利的拿到自己心仪的offer。
如此。相信自己,没有做不到的,只有想不到的。
虽然面试失败了,但我也不会放弃入职字节跳动的决心的!建议大家面试之前都要有充分的准备,顺顺利利的拿到自己心仪的offer。