1. 程式人生 > >MeasureSpec中三種模式:UNSPECIFIED,AT_MOST,EXACTLY

MeasureSpec中三種模式:UNSPECIFIED,AT_MOST,EXACTLY

在自定義ViewViewGroup的時候,我們經常會遇到int型的MeasureSpec來表示一個元件的大小,這個變數裡面不僅有元件的尺寸大小,還有大小的模式。

這個大小的模式,有點難以理解。在系統中元件的大小模式有三種:

1.精確模式(MeasureSpec.EXACTLY

在這種模式下,尺寸的值是多少,那麼這個元件的長或寬就是多少。

2.最大模式(MeasureSpec.AT_MOST

這個也就是父元件,能夠給出的最大的空間,當前元件的長或寬最大隻能為這麼大,當然也可以比這個小。

3.未指定模式(MeasureSpec.UNSPECIFIED

這個就是說,當前元件,可以隨便用空間,不受限制。

    可能有很多人想不通,一個int型整數怎麼可以表示兩個東西(大小模式和大小的值),一個int型別我們知道有32位。而模式有三種,要表示三種狀  態,至少得2位二進位制位。於是系統採用了最高的2位表示模式。如圖:

最高兩位是00的時候表示"未指定模式"。即MeasureSpec.UNSPECIFIED

最高兩位是01的時候表示"'精確模式"。即MeasureSpec.EXACTLY

最高兩位是11的時候表示"最大模式"。即MeasureSpec.AT_MOST

很多人一遇到位操作頭就大了,為了操作簡便,於是系統給我提供了一個MeasureSpec工具類。

這個工具類有四個方法和三個常量(上面所示)供我們使用:

//這個是由我們給出的尺寸大小和模式生成一個包含這兩個資訊的int變數,這裡這個模式這個引數,傳三個常量中的一個。

publicstaticintmakeMeasureSpec(int size, intmode)

//這個是得到這個變數中表示的模式資訊,將得到的值與三個常量進行比較。

publicstaticint getMode(int measureSpec)

//這個是得到這個變數中表示的尺寸大小的值。

publicstaticint getSize(int measureSpec)

//把這個變數裡面的模式和大小組成字串返回來,方便打日誌

publicstatic String toString(

int measureSpec)


MeasureSpec.EXACTLY:使用measureSpec中size的值作為寬高的精確值

當我們將控制元件的layout_width或layout_height指定為具體數值時如andorid:layout_width="50dip",或者為FILL_PARENT是,都是控制元件大小已經確定的情況,都是精確尺寸。

        MeasureSpec.AT_MOST:使用measureSpec中size的值作為最大值,採用不超過這個值的最大允許值

        當控制元件的layout_width或layout_height指定為WRAP_CONTENT時,控制元件大小一般隨著控制元件的子空間或內容進行變化,此時控制元件尺寸只要不超過父控制元件允許的最大尺寸即可。因此,此時的mode是AT_MOST,size給出了父控制元件允許的最大尺寸。

        MeasureSpec.UNSPECIFIED是未指定尺寸,這種情況不多


以scrollview巢狀listview為例,我們重寫onMesure方法:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int width = MeasureSpec.makeMeasureSpec(1000>>2,MeasureSpec.AT_MOST);
    super.onMeasure(widthMeasureSpec, width);
}
1000的二進位制:1111101000

右移2位後:11111010,十進位制為:250

這樣就指定了listview的高度為250px以內的最大允許值(一般就是250)

把AT_MOST改為EXACTLY,則精確指定listview高度值為250px,如果listview內容全部顯示的高度為500px(大於250px),那麼當measureSpec中size的值為250px(小於500px)時,效果是一樣的

如果設定的measureSpec中size的值大於listview內容全部顯示的高度,那麼設定成AT_MOST時,最多顯示listview內容全部顯示的高度,而EXACTLY還是顯示measureSpec中size的值,所以EXACTLY在這種情況下,後面會留有空白高度(measureSpec中size的值大於listview內容全部顯示的高度的部分顯示為空白

所以,一般這樣寫可以讓listview正確測量:

int width = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,MeasureSpec.AT_MOST);
MAX_VALUE右移2位後,即使不是最大整數了,listview的高度也一般不可能超過它

第一個引數有個最大值的限制:1073741823(二進位制的30個1),MAX_VALUE是1個0加上31個1(二進位制),所以也可以右移1位,但是由於最前面兩位表示mode,而不是size,所有右移1位和右移2位是一樣的(前面兩位的值都會被mode的程式碼覆蓋)

相關推薦

MeasureSpec模式UNSPECIFIEDAT_MOSTEXACTLY

在自定義View和ViewGroup的時候,我們經常會遇到int型的MeasureSpec來表示一個元件的大小,這個變數裡面不僅有元件的尺寸大小,還有大小的模式。 這個大小的模式,有點難以理解。在系統中元件的大小模式有三種: 1.精確模式(MeasureSpec.EXA

MeasureSpec模式

MeasureSpec.EXACTLY:使用measureSpec中size的值作為寬高的精確值 當我們將控制元件的layout_width或layout_height指定為具體數值時如andorid:layout_width=”50dip”,或者為FILL_

python實戰之IO多路複用(別名事件驅動模式(sellect,poll,epoll)Python的selectors模組)

IO多路複用前需瞭解 通常,我們寫伺服器處理模型的程式時,有以下幾種模型: (1)每收到一個請求,建立一個新的程序,來處理該請求; (2)每收到一個請求,建立一個新的執行緒,來處理該請求; (3)每收到一個請求,放入一個事件列表,讓主程序通過非阻塞I/O方式來處理請求 上面的幾種

binlog模式的區別(rowstatementmixed)

binlog模式分三種(row,statement,mixed) 1.Row 日誌中會記錄成每一行資料被修改的形式,然後在slave端再對相同的資料進行修改,只記錄要修改的資料,只有value,不會有sql多表關聯的情況。優點:在row模式下,bin-log中可以不記錄執

js定義變數的方式const var let的區別。

const   var  let區別 1.const 定義的變數不可以修改,而且必須初始化 const  a = 3;正確 const a;錯誤,必須初始化 console.log("函式外const定義a:"+"a");    有值輸出;

Apache 工作的模式Prefork、Worker、Event

Apache 的三種工作模式(Prefork、Worker、Event) Web伺服器Apache目前一共有三種穩定的MPM(Multi-Processing Module,多程序處理模組)模式。 它們分別是prefork,worker、event,它們同時也代表這Apache的演變和發展。 本文原文轉

死鎖的形式一般死鎖巢狀管程鎖死重入鎖死

package com.cxt.Lock; import com.cxt.thread.Synchronizer; import com.cxt.thread.TestLock; //lock implementation with nested monitor lockout problem /**

小白學習VUE第一課---如何看懂網上搜索到的VUE程式碼或文章---使用VUE的模式

小白學習VUE第一課---如何看懂網上搜索到的VUE程式碼或文章---使用VUE的三種模式: 直接引用VUE; 將vue.js下載到本地後本目錄下使用; 安裝Node環境下使用; ant-design-vue只是Vue實現的一組ant-design UI模板程式碼,真正使用的還是VUE環境; &

androidMVCMVP和MVVM模式詳解析

我們都知道,android本身就採用了MVC模式,model層資料來源層我們就不說了,至於view層即通過xml來體現,而 controller層的角色一般是由activity來擔當的。雖然我們專案用到了MVP模式,但是現在人們並沒有總結出一種規範,所以MVP模式的寫法並不

JavaScript彈出式訊息提醒的命令是什麼?(如警告確認資訊輸入)

1、警告框alert,在js中直接運用alert("警告"); 2、確認框confirm。 confirm() 方法用於顯示一個帶有指定訊息和 OK 及取消按鈕的對話方塊,根據使用者點選確認框上的按鈕返回true與false。 用法: if(confirm("確定要清空資料

Java排序冒泡選擇插入排序

反序 三種 blog void bubble public string length 選擇 三種排序:冒泡,選擇,插入排序 public static void bubbleSort(int[] source){ // 交換

oop思維意識類 模塊命名空間類擴展之繼承 、組合、mixin模式

經驗 .cn 第四版 分享圖片 實例 pytho 模塊 組合 為什麽 python的書都是講怎麽創建類怎麽實例化對象,一般會用使用了,但還不具備這種編程意識。這是從python學習手冊第四版節選出來的,書中說oop不僅是一種技術,更是一種經驗。學習大神的看法,為什麽需

Linuxvim的模式以及基本命令

body 指定 col -s global 使用 全局 oba .com 在Linux中vim的三種模式分別為:命令模式、末行模式、編輯模式。以下是三者的關系圖: 三種模式的彼此切換: 命令模式是vim中的默認模式。 命令模式切換至末行模式: 使用英文冒號(:)。 末行模

排序快排歸並堆排

new swap 簡單 數組合並 col 最大 heapsort 堆排序 大神 轉自:http://www.cnblogs.com/LUO77/p/5798149.html (一)快排 快排考的是最多次的。之前看大神寫的算法很簡單,思想也很好。就一直用他的思想去思考快排

應用負載均衡之LVS(一)基本概念和模式

保存 訪問 方式 video big key vhdl cisc vid 網站架構中,負載均衡技術是實現網站架構伸縮性的主要手段之一。所謂"伸縮性",是指可以不斷向集群中添加新的服務器來提升性能、緩解不斷增加的並發用戶訪問壓力。通俗地講,就是一頭牛拉不動時,就用兩頭、三

VM Ware網絡適配器的模式介紹

sha 獨立計算 mage 需要 只需要 獨立 隨機生成 管理 網絡地址轉換 大家在安裝完虛擬機後,默認安裝了兩個虛擬網卡,VMnet1和VMnet8,如下圖:其中VMnet1是host網卡,用於host方式連接網絡的。VMnet8是NAT網卡,用於NAT方式連接網絡的。它

selenium提供了模式的斷言assert,verify,waitfor

class note ext val 沒有 radio 菜單 測試 log Assert:失敗時,該測試將終止 Verify:失敗時,該測試繼續執行,並將錯誤日誌記錄在日顯示屏 Waitfor:等待某些條件變為真,一般使用在AJAX應用程序的測試 斷言常

單例模式模式餓漢(饑漢)、飽漢(懶漢)、雙重鎖模式

singleton pub null 關系 設計模式的 mage 了吧 ref image 今天看某培訓機構提供面試題中設計模式部分,對飽漢和餓漢比較感興趣,就搜了一下,然後誤人子弟,然後就覺得有必要記錄一下 聲明:本人沒有看過設計模式的書籍,只是根據概念對比的看了一些博

【按鍵】短按長按按鍵釋放模式的按鍵掃描程式(軟體消抖動)--- 矩陣鍵盤

請先閱讀上篇: 短按,長按,按鍵釋放,三種模式的按鍵掃描程式(軟體消抖動) 上面的程式適用於單個按鍵,那是不是也可以適用於矩陣鍵盤呢? 答案是肯定的。 接下來在這裡做一個簡單的擴充套件,具體框架不用改變,所以具體的框架內容和思路在這裡不詳述了,自行參考上篇文章,這裡就說說擴充套件

【按鍵】短按長按按鍵釋放模式的按鍵掃描程式(軟體消抖動)

先來說一下這三種模式的意思: 1. 短按模式:單擊按鍵時,返回一次有效按鍵值;長按時也只返回一次有效按鍵值。這樣可以有效地排除因不小心長按帶來的返回多次有效按鍵,進而執行多次按鍵處理程式。 2. 長按模式: 單擊按鍵時,返回一次有效按鍵;長按時,返回多次有效按鍵值。這樣可以很快的調節