解析:繼承ViewGroup后的子類如何重寫onMeasure方法
更新時間:2013年06月15日 10:48:53 作者:
本篇文章是對繼承ViewGroup后的子類如何重寫onMeasure方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
1.首先貼上我試驗成功的代碼
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int measureWidth = MeasureSpec.getSize(widthMeasureSpec);
int measureHeigth = MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(measureWidth, measureHeigth);
// TODO Auto-generated method stub
for(int i= 0;i<getChildCount();i++){
View v = getChildAt(i);
Log.v(TAG, "measureWidth is " +v.getMeasuredWidth() + "measureHeight is "+v.getMeasuredHeight());
int widthSpec = 0;
int heightSpec = 0;
LayoutParams params = v.getLayoutParams();
if(params.width > 0){
widthSpec = MeasureSpec.makeMeasureSpec(params.width, MeasureSpec.EXACTLY);
}else if (params.width == -1) {
widthSpec = MeasureSpec.makeMeasureSpec(measureWidth, MeasureSpec.EXACTLY);
} else if (params.width == -2) {
widthSpec = MeasureSpec.makeMeasureSpec(measureWidth, MeasureSpec.AT_MOST);
}
if(params.height > 0){
heightSpec = MeasureSpec.makeMeasureSpec(params.height, MeasureSpec.EXACTLY);
}else if (params.height == -1) {
heightSpec = MeasureSpec.makeMeasureSpec(measureHeigth, MeasureSpec.EXACTLY);
} else if (params.height == -2) {
heightSpec = MeasureSpec.makeMeasureSpec(measureWidth, MeasureSpec.AT_MOST);
}
v.measure(widthSpec, heightSpec);
}
}
解釋一下:
首先判斷params.width的值是多少,有三種情況。
如果是大于零的話,及傳遞的就是一個具體的值,那么,構(gòu)造MeasupreSpec的時候可以直接用EXACTLY。
如果為-1的話,就是MatchParent的情況,那么,獲得父View的寬度,再用EXACTLY來構(gòu)造MeasureSpec。
如果為-2的話,就是wrapContent的情況,那么,構(gòu)造MeasureSpec的話直接用一個負(fù)數(shù)就可以了。
復(fù)制代碼 代碼如下:
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int measureWidth = MeasureSpec.getSize(widthMeasureSpec);
int measureHeigth = MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(measureWidth, measureHeigth);
// TODO Auto-generated method stub
for(int i= 0;i<getChildCount();i++){
View v = getChildAt(i);
Log.v(TAG, "measureWidth is " +v.getMeasuredWidth() + "measureHeight is "+v.getMeasuredHeight());
int widthSpec = 0;
int heightSpec = 0;
LayoutParams params = v.getLayoutParams();
if(params.width > 0){
widthSpec = MeasureSpec.makeMeasureSpec(params.width, MeasureSpec.EXACTLY);
}else if (params.width == -1) {
widthSpec = MeasureSpec.makeMeasureSpec(measureWidth, MeasureSpec.EXACTLY);
} else if (params.width == -2) {
widthSpec = MeasureSpec.makeMeasureSpec(measureWidth, MeasureSpec.AT_MOST);
}
if(params.height > 0){
heightSpec = MeasureSpec.makeMeasureSpec(params.height, MeasureSpec.EXACTLY);
}else if (params.height == -1) {
heightSpec = MeasureSpec.makeMeasureSpec(measureHeigth, MeasureSpec.EXACTLY);
} else if (params.height == -2) {
heightSpec = MeasureSpec.makeMeasureSpec(measureWidth, MeasureSpec.AT_MOST);
}
v.measure(widthSpec, heightSpec);
}
}
解釋一下:
首先判斷params.width的值是多少,有三種情況。
如果是大于零的話,及傳遞的就是一個具體的值,那么,構(gòu)造MeasupreSpec的時候可以直接用EXACTLY。
如果為-1的話,就是MatchParent的情況,那么,獲得父View的寬度,再用EXACTLY來構(gòu)造MeasureSpec。
如果為-2的話,就是wrapContent的情況,那么,構(gòu)造MeasureSpec的話直接用一個負(fù)數(shù)就可以了。
相關(guān)文章
Android Studio打包APK文件具體實現(xiàn)步驟解析
這篇文章主要介紹了Android Studio打包APK文件具體實現(xiàn)步驟解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11Android Studio 設(shè)置代碼提示和代碼自動補全快捷鍵方式
這篇文章主要介紹了Android Studio 設(shè)置代碼提示和代碼自動補全快捷鍵方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03淺談Android Studio如何Debug對應(yīng)so文件C/C++代碼
本篇文章主要介紹了淺談Android Studio如何Debug對應(yīng)so文件C/C++代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12Android編程讀取Assets所有文件(遍歷每一個文件夾)并存入sdcard的方法
這篇文章主要介紹了Android編程讀取Assets所有文件(遍歷每一個文件夾)并存入sdcard的方法,涉及Android針對文件與目錄的遍歷及I/O操作相關(guān)技巧,需要的朋友可以參考下2016-02-02Flutter的鍵值存儲數(shù)據(jù)庫使用示例詳解
這篇文章主要為大家介紹了Flutter的鍵值存儲數(shù)據(jù)庫使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Android Flutter實現(xiàn)視頻上滑翻頁效果的示例代碼
我們在短視頻應(yīng)用中經(jīng)常會看到不停上滑瀏覽下一條視頻的沉浸式交互效果,這種交互能夠讓用戶不停地翻頁,直到找到喜歡的視頻內(nèi)容。本文將通過Flutter中的PageView組件實現(xiàn),感興趣的可以了解一下2022-10-10Android?性能優(yōu)化實現(xiàn)全量編譯提速的黑科技
這篇文章主要為大家介紹了Android?性能優(yōu)化實現(xiàn)全量編譯提速的黑科技,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09