解析:繼承ViewGroup后的子類(lèi)如何重寫(xiě)onMeasure方法
更新時(shí)間:2013年06月15日 10:48:53 作者:
本篇文章是對(duì)繼承ViewGroup后的子類(lèi)如何重寫(xiě)onMeasure方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
1.首先貼上我試驗(yàn)成功的代碼
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è)具體的值,那么,構(gòu)造MeasupreSpec的時(shí)候可以直接用EXACTLY。
如果為-1的話,就是MatchParent的情況,那么,獲得父View的寬度,再用EXACTLY來(lái)構(gòu)造MeasureSpec。
如果為-2的話,就是wrapContent的情況,那么,構(gòu)造MeasureSpec的話直接用一個(gè)負(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è)具體的值,那么,構(gòu)造MeasupreSpec的時(shí)候可以直接用EXACTLY。
如果為-1的話,就是MatchParent的情況,那么,獲得父View的寬度,再用EXACTLY來(lái)構(gòu)造MeasureSpec。
如果為-2的話,就是wrapContent的情況,那么,構(gòu)造MeasureSpec的話直接用一個(gè)負(fù)數(shù)就可以了。
相關(guān)文章
Android開(kāi)發(fā)筆記之:Dialog的使用詳解
本篇文章是對(duì)Android中Dialog的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
Android學(xué)習(xí)之AppWidget筆記分享
這篇文章主要為大家詳細(xì)介紹了Android學(xué)習(xí)筆記之AppWidget的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-08-08
Android線程的優(yōu)先級(jí)設(shè)置方法技巧
對(duì)于Android平臺(tái)上的線程優(yōu)先級(jí)設(shè)置來(lái)說(shuō)可以處理很多并發(fā)線程的阻塞問(wèn)題,比如很多無(wú)關(guān)緊要的線程會(huì)占用大量的CPU時(shí)間,雖然通過(guò)了MultiThread來(lái)解決慢速I(mǎi)/O但是合理分配優(yōu)先級(jí)對(duì)于并發(fā)編程來(lái)說(shuō)十分重要2016-02-02
Android模擬實(shí)現(xiàn)網(wǎng)易新聞客戶端
這篇文章主要為大家詳細(xì)介紹了Android模擬實(shí)現(xiàn)網(wǎng)易新聞客戶端,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
Android Studio項(xiàng)目中導(dǎo)入開(kāi)源庫(kù)的方法
這篇文章主要介紹了Android Studio項(xiàng)目中導(dǎo)入開(kāi)源庫(kù)的方法,即使用第三方庫(kù)、第三廣場(chǎng)框架的方法,需要的朋友可以參考下2015-06-06

