<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆雜記

       :: 首頁(yè) :: 新隨筆 ::  ::  :: 管理 ::

    有時(shí),Android系統(tǒng)控件無(wú)法滿足我們的需求,因此有必要自定義View。具體方法參見(jiàn)官方開(kāi)發(fā)文檔:http://developer.android.com/guide/topics/ui/custom-components.html


    一般來(lái)說(shuō),自定義控件都會(huì)去重寫(xiě)View的onMeasure方法,因?yàn)樵摲椒ㄖ付ㄔ摽丶谄聊簧系拇笮 ?/p>

    protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)

    onMeasure傳入的兩個(gè)參數(shù)是由上一層控件傳入的大小,有多種情況,重寫(xiě)該方法時(shí)需要對(duì)計(jì)算控件的實(shí)際大小,然后調(diào)用setMeasuredDimension(int, int)設(shè)置實(shí)際大小。


    onMeasure傳入的widthMeasureSpec和heightMeasureSpec不是一般的尺寸數(shù)值,而是將模式和尺寸組合在一起的數(shù)值。我們需要通過(guò)int mode = MeasureSpec.getMode(widthMeasureSpec)得到模式,用int size = MeasureSpec.getSize(widthMeasureSpec)得到尺寸。


    mode共有三種情況,取值分別為MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY, MeasureSpec.AT_MOST。


    MeasureSpec.EXACTLY是精確尺寸,當(dāng)我們將控件的layout_width或layout_height指定為具體數(shù)值時(shí)如andorid:layout_width="50dip",或者為FILL_PARENT是,都是控件大小已經(jīng)確定的情況,都是精確尺寸。


    MeasureSpec.AT_MOST是最大尺寸,當(dāng)控件的layout_width或layout_height指定為WRAP_CONTENT時(shí),控件大小一般隨著控件的子空間或內(nèi)容進(jìn)行變化,此時(shí)控件尺寸只要不超過(guò)父控件允許的最大尺寸即可。因此,此時(shí)的mode是AT_MOST,size給出了父控件允許的最大尺寸。


    MeasureSpec.UNSPECIFIED是未指定尺寸,這種情況不多,一般都是父控件是AdapterView,通過(guò)measure方法傳入的模式。


    因此,在重寫(xiě)onMeasure方法時(shí)要根據(jù)模式不同進(jìn)行尺寸計(jì)算。下面代碼就是一種比較典型的方式:

    @Override    
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    
        setMeasuredDimension(getMeasuredLength(widthMeasureSpec, true), getMeasuredLength(heightMeasureSpec, false));    
    }    
        
        
    private int getMeasuredLength(int length, boolean isWidth) {    
        int specMode = MeasureSpec.getMode(length);    
        int specSize = MeasureSpec.getSize(length);    
        int size;    
        int padding = isWidth ? getPaddingLeft() + getPaddingRight()    
                : getPaddingTop() + getPaddingBottom();    
        if (specMode == MeasureSpec.EXACTLY) {    
            size = specSize;    
        } else {    
            size = isWidth ? padding + mWave.length / 4 : DEFAULT_HEIGHT    
                    + padding;    
            if (specMode == MeasureSpec.AT_MOST) {    
                size = Math.min(size, specSize);    
            }    
        }    
        return size;    
    }  

    posted on 2012-03-15 19:18 天宇恒星 閱讀(30320) 評(píng)論(2)  編輯  收藏 所屬分類: Android

    評(píng)論

    # re: Android中自定義View的MeasureSpec使用 2013-02-01 11:53 jeremy_sky
    你好。mode共有三種情況,取值分別為MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY, MeasureSpec.AT_MOST。既然三種模式對(duì)應(yīng)不同的數(shù)值,那么為什么在源碼中需要這個(gè)模式屬性呢?比如:(Linearlayout.java 方法 measureVertical(int widthMeasureSpec, int heightMeasureSpec)部分源碼 )
    if (heightMode == MeasureSpec.EXACTLY && lp.height == 0 && lp.weight > 0) {
    final int totalLength = mTotalLength;
    mTotalLength = Math.max(totalLength, totalLength + lp.topMargin + lp.bottomMargin);
    } else {
    int oldHeight = Integer.MIN_VALUE;

    if (lp.height == 0 && lp.weight > 0) {
    oldHeight = 0;
    lp.height = LayoutParams.WRAP_CONTENT;
    }
    ...
    }
    能幫我解釋一下么?(主要是代碼沒(méi)看懂~~~)

      回復(fù)  更多評(píng)論
      

    # re: Android中自定義View的MeasureSpec使用 2014-12-01 19:53 渣渣
    heightMode == MeasureSpec.EXACTLY && lp.height == 0 && lp.weight > 0這個(gè)很明顯是要判斷權(quán)重weight,哎寫(xiě)自定義控件確實(shí)是個(gè)麻煩事,要考慮寬高,還要考慮padding,weight。  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 亚洲妇女无套内射精| 精品日韩99亚洲的在线发布| 亚洲色丰满少妇高潮18p| **aaaaa毛片免费| 亚洲福利视频网站| 四虎在线免费视频| 久久精品国产99国产精品亚洲| 97性无码区免费| 亚洲真人无码永久在线观看| 国产无人区码卡二卡三卡免费| 久久亚洲最大成人网4438| 99视频在线精品免费观看6| 亚洲综合一区国产精品| 青青草国产免费久久久91| 亚洲欧美在线x视频| 相泽亚洲一区中文字幕| 免费国产成人18在线观看| 91亚洲一区二区在线观看不卡 | 亚洲国产精品人久久电影| 亚洲中文无码永久免费| 亚洲AV无码AV日韩AV网站| 亚洲精品国精品久久99热| 久久精品国产免费| 国产亚洲sss在线播放| 免费一级毛片一级毛片aa| 中文字幕a∨在线乱码免费看| 亚洲小视频在线观看| 久久久久久99av无码免费网站| 国内成人精品亚洲日本语音| 亚洲中文字幕无码一久久区| 在线a免费观看最新网站| 日韩国产欧美亚洲v片| 一本久久a久久精品亚洲| 91黑丝国产线观看免费| 青娱乐在线免费观看视频| 亚洲av激情无码专区在线播放| 好吊妞在线新免费视频| 水蜜桃视频在线观看免费播放高清| 亚洲国产av一区二区三区丶| 亚洲精品老司机在线观看| 91热久久免费精品99|