onMeasure实例分析
2015-10-16 15:47
417 查看
本文转自:http://blog.csdn.net/u012604322/article/details/17097105
上面这个两个视图是Android API中没有给出来的但在来电接听和闹钟被使用到的一个widget视图——GlowPadView.java
我们通过源码来看看这个View的大小是怎么通过onMeasure来控制的。
mOuterRing为一个指定的圆(由Shape画出,因此给出的是宽和高,相当于圆半径),mOuterRadius为最大的虚线圆的半径,mMaxTargetWidth为图中Zzz图片或其它图片的宽度。这部分值是有开发人员指定的自己期望的自己的视图中属性的大小
我们从width分析,承载这个View的ViewGroup可能有两种情况,一(A)提供的空间比上面我们给出的值大,二(B)是要小(开发中基本上我们不会允许这种状况出现,但设计的逻辑依然必须考虑到这种可能)。然后就要看的是View的layout_width,一是wrap_content,对应AT_MOST,A得到的值为给出的值,B值为父视图的值,虽然我们不希望这样,但父视图只给出了这么些空间,我们也只得这样。
二是match_parent,对应只有一个父视图的值,这也是符合要求的。
一个好的设计应该要考虑到各种情况下的使用,而一个可复用的框架设计更是如此,设计之前需要预想到各种可能的应用情况。
上面这个两个视图是Android API中没有给出来的但在来电接听和闹钟被使用到的一个widget视图——GlowPadView.java
我们通过源码来看看这个View的大小是怎么通过onMeasure来控制的。
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { final int minimumWidth = getSuggestedMinimumWidth(); final int minimumHeight = getSuggestedMinimumHeight(); int computedWidth = resolveMeasured(widthMeasureSpec, minimumWidth); int computedHeight = resolveMeasured(heightMeasureSpec, minimumHeight); ... setMeasuredDimension(computedWidth, computedHeight); }
@Override protected int getSuggestedMinimumWidth() { // View should be large enough to contain the background + handle and // target drawable on either edge. return (int) (Math.max(mOuterRing.getWidth(), 2 * mOuterRadius) + mMaxTargetWidth); }
mOuterRing为一个指定的圆(由Shape画出,因此给出的是宽和高,相当于圆半径),mOuterRadius为最大的虚线圆的半径,mMaxTargetWidth为图中Zzz图片或其它图片的宽度。这部分值是有开发人员指定的自己期望的自己的视图中属性的大小
private int resolveMeasured(int measureSpec, int desired) { int result = 0; int specSize = MeasureSpec.getSize(measureSpec); switch (MeasureSpec.getMode(measureSpec)) { case MeasureSpec.UNSPECIFIED: result = desired; break; case MeasureSpec.AT_MOST: result = Math.min(specSize, desired); break; case MeasureSpec.EXACTLY: default: result = specSize; } return result; }
我们从width分析,承载这个View的ViewGroup可能有两种情况,一(A)提供的空间比上面我们给出的值大,二(B)是要小(开发中基本上我们不会允许这种状况出现,但设计的逻辑依然必须考虑到这种可能)。然后就要看的是View的layout_width,一是wrap_content,对应AT_MOST,A得到的值为给出的值,B值为父视图的值,虽然我们不希望这样,但父视图只给出了这么些空间,我们也只得这样。
二是match_parent,对应只有一个父视图的值,这也是符合要求的。
一个好的设计应该要考虑到各种情况下的使用,而一个可复用的框架设计更是如此,设计之前需要预想到各种可能的应用情况。
相关文章推荐
- android 5.0 悬浮窗使用 之“有权查看应用使用情况”
- 让div垂直居中的实现方法
- CSS实现文字内容不被截断当超出指定长度时该字符串自动整体换到下一行
- Android studio使用GitHub托管代码
- 【数据存储】coredata、sqlite、fmdb和sqlitepersistentobject
- Android 开源项目分类汇总
- 前端CSS颜色代码大全
- Dialog中的cancel和dismiss
- 共同期待 经典Q版坦克大战揭开神秘面纱
- 基于JDK 8的Dubbo Admin
- Android 升级下载 它们的定义Updates 兼容版本
- 比较Java数组,ArrayList,LinkedList,Vector 性能比较
- Linux定时任务执行,删除某个时间段的文件
- 解读Python编程中的命名空间与作用域
- 微信连WIFI
- Dubbo错误No provider available for the service
- 图计算框架解决矩阵分解
- c# 委托delegate 编写计算器
- JSON.parse()和JSON.stringify()使用介绍
- jquery tmpl 详解