为什么需要自定义View
- 现有的View满足不了你的需求,也没有办法从已有控件派生一个出来;界面元素需要自己绘制。
- 现有View可以满足要求,把它做成自定义View只是为了抽象
为这个自定义View提供若干方法,方便调用着操纵View。
通常做法是派生一个已有View,或者结合xml文件直接inflate。
Attention
能够用Android基础控件解决的问题就尽量用基础控件,其次是用基础控件的组合。如果是确实有必要自定义才考虑自定义。
自定义的控件,既需要耗费较长的开发时间,又不一定能保证有基础控件那么高的效率(基础控件都是谷歌优化过了的)。
如何系统学习自定义控件
推荐资料
关键点
- 自定义控件的价值和使用场景
- 三大方法: onMeasure,onLayout,Draw
- 自定义属性
- 事件传递
应用场景
-
组合控件:试题控件(TextView+VideoGroup)、下拉刷新、瀑布流控件、带左/右滑功能的控件、视频控件等。
通过Android的基础控件(TextView、CheckBox、Button、ProgressBar等)组合而成,
-
完全自定义控件:继承自View、TextureView或SurfaceView,然后重写核心的回调方法。
比如:webview + loading动画(SurfaceView)、
比如输入法中的手写控件、图文混排控件(现在很多都是通过webview加载网页实现了)、词典取词控件、图表控件、个性化进度条、
弹幕显示控件、Markdown控件、IDE代码编辑控件等。
- 普通View适合于处理量比较小,帧率比较小的动画,比如说象棋游戏之类的
- SurfaceView适合游戏,高品质动画方面的画图。因为SurfaceView中定义一个专门的线程来完成画图工作,不需要等待View的刷图,提高性能。
自定义View Class & 属性实践
How to create Customized View and 属性”key”.
自定义View项目实践
优质开源库
- awesome-android-ui : https://github.com/wasabeef/awesome-android-ui
- android-open-project : https://github.com/Trinea/android-open-project