码迷,mamicode.com
首页 > 其他好文 > 详细

自定义View之onMeasure()

时间:2016-05-26 06:26:00      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:android   源码   

; font-family:Arial,Console,Verdana,‘Courier New‘"> android源码

技术分享           技术分享

上面这个两个视图是Android API中没有给出来的但在来电接听和闹钟被使用到的一个widget视图——GlowPadView.java

我们通过源码来看看这个View的大小是怎么通过onMeasure来控制的。

[java] view plaincopy技术分享技术分享
  1.     @Override  
  2.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  3.         final int minimumWidth = getSuggestedMinimumWidth();  
  4.         final int minimumHeight = getSuggestedMinimumHeight();  
  5.         int computedWidth = resolveMeasured(widthMeasureSpec, minimumWidth);  
  6.         int computedHeight = resolveMeasured(heightMeasureSpec, minimumHeight);  
  7.   
  8. ...  
  9.   
  10.         setMeasuredDimension(computedWidth, computedHeight);  
  11.     }  

[java] view plaincopy技术分享技术分享
  1. @Override  
  2. protected int getSuggestedMinimumWidth() {  
  3.     // View should be large enough to contain the background + handle and  
  4.     // target drawable on either edge.  
  5.     return (int) (Math.max(mOuterRing.getWidth(), 2 * mOuterRadius) + mMaxTargetWidth);  
  6. }  
mOuterRing为一个指定的圆(由Shape画出,因此给出的是宽和高,相当于圆半径),mOuterRadius为最大的虚线圆的半径,mMaxTargetWidth为图中Zzz图片或其它图片的宽度。这部分值是有开发人员指定的自己期望的自己的视图中属性的大小
[java] view plaincopy技术分享技术分享
  1. private int resolveMeasured(int measureSpec, int desired)  
  2. {  
  3.     int result = 0;  
  4.     int specSize = MeasureSpec.getSize(measureSpec);  
  5.     switch (MeasureSpec.getMode(measureSpec)) {  
  6.         case MeasureSpec.UNSPECIFIED:  
  7.             result = desired;  
  8.             break;  
  9.         case MeasureSpec.AT_MOST:  
  10.             result = Math.min(specSize, desired);  
  11.             break;  
  12.         case MeasureSpec.EXACTLY:  
  13.         default:  
  14.             result = specSize;  
  15.     }  
  16.     return result;  
  17. }  
我们从width分析,承载这个View的ViewGroup可能有两种情况,一(A)提供的空间比上面我们给出的值大,二(B)是要小(开发中基本上我们不会允许这种状况出现,但设计的逻辑依然必须考虑到这种可能)。然后就要看的是View的layout_width,一是wrap_content,对应AT_MOST,A得到的值为给出的值,B值为父视图的值,虽然我们不希望这样,但父视图只给出了这么些空间,我们也只得这样。

二是match_parent(EXACTLY),对应只有一个父视图的值,这也是符合要求的。


一个好的设计应该要考虑到各种情况下的使用,而一个可复用的框架设计更是如此,设计之前需要预想到各种可能的应用情况。


自定义View之onMeasure()

标签:android   源码   

原文地址:http://blog.csdn.net/xuzhuaaron1/article/details/51503035

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
分享档案
周排行
mamicode.com排行更多图片
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!