青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

xiaoguozi's Blog
Pay it forword - 我并不覺的自豪,我所嘗試的事情都失敗了······習(xí)慣原本生活的人不容易改變,就算現(xiàn)狀很糟,他們也很難改變,在過程中,他們還是放棄了······他們一放棄,大家就都是輸家······讓愛傳出去,很困難,也無法預(yù)料,人們需要更細(xì)心的觀察別人,要隨時(shí)注意才能保護(hù)別人,因?yàn)樗麄兾幢刂雷约阂裁础ぁぁぁぁ?/span>

今天學(xué)習(xí)android自定義組件:docs/guide/topics/ui/custom-components.html

其中有兩個(gè)對(duì)布局界面影響很的方法,onDraw(),和onMeasure().

onDraw()比較好理解.onMeasure()就比較難理解一些,也更復(fù)雜些 ,引用文檔中的說法就是:

onMeasure() is a little more involved.
其實(shí)還有另一個(gè)方面的原因就是我對(duì)這個(gè)單詞measure不是很知道,然后果了下詞典,就放了下心,確實(shí)是測(cè)量的意思.

實(shí)現(xiàn)onMeasure()方法基本需要完成下面三個(gè)方面的事情(最終結(jié)果是你自己寫相應(yīng)代碼得出測(cè)量值并調(diào)用view的一個(gè)方法進(jìn)行設(shè)置,告訴給你的view安排位置大小的父容器你要多大的空間.):

1.傳遞進(jìn)來的參數(shù),widthMeasureSpec,和heightMeasureSpec是你對(duì)你應(yīng)該得出來的測(cè)量值的限制.

 

The overidden onMeasure() method is called with width and height measure specifications(widthMeasureSpec and heightMeasureSpec parameters,both are integer codes representing dimensions) which should be treated as requirements for the restrictions on the width and height measurements you should produce.

2. 你在onMeasure計(jì)算出來設(shè)置的width和height將被用來渲染組件.應(yīng)當(dāng)盡量在傳遞進(jìn)來的width和height 聲明之間.

雖然你也可以選擇你設(shè)置的尺寸超過傳遞進(jìn)來的聲明.但是這樣的話,父容器可以選擇,如clipping,scrolling,或者拋出異常,或者(也許是用新的聲明參數(shù))再次調(diào)用onMeasure()

Your component's onMeasure() method should calculate a measurement width and height which will be required to render the component.it should try to stay within the specified passed in.although it can choose to exceed them(in this case,the parent can choose what to do,including clipping,scrolling,throwing an excption,or asking the onMeasure to try again,perhaps with different measurement specifications).

3.一但width和height計(jì)算好了,就應(yīng)該調(diào)用View.setMeasuredDimension(int width,int height)方法,否則將導(dǎo)致拋出異常.
Once the width and height are calculated,the setMeasureDimension(int width,int height) method must be called with the calculated measurements.Failure to do this will result in an exceptiion being thrown
   

在Android提提供的一個(gè)自定義View示例中(在API demos 中的 view/LabelView)可以看到一個(gè)重寫onMeasure()方法的

實(shí)例,也比較好理解.

01/**
02 * @see android.view.View#measure(int, int)
03 */
04@Override
05protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
06    setMeasuredDimension(measureWidth(widthMeasureSpec),
07            measureHeight(heightMeasureSpec));
08}
09 
10/**
11 * Determines the width of this view
12 * @param measureSpec A measureSpec packed into an int
13 * @return The width of the view, honoring constraints from measureSpec
14 */
15private int measureWidth(int measureSpec) {
16    int result = 0;
17    int specMode = MeasureSpec.getMode(measureSpec);
18    int specSize = MeasureSpec.getSize(measureSpec);
19 
20    if (specMode == MeasureSpec.EXACTLY) {
21        // We were told how big to be
22        result = specSize;
23    } else {
24        // Measure the text
25        result = (int) mTextPaint.measureText(mText) + getPaddingLeft()
26                + getPaddingRight();
27        if (specMode == MeasureSpec.AT_MOST) {
28            // Respect AT_MOST value if that was what is called for by measureSpec
29            result = Math.min(result, specSize);
30        }
31    }
32 
33    return result;
34}

 

直接看measureWidth()

首先看到的是參數(shù),分別代表寬度和高度的MeasureSpec

android2.2文檔中對(duì)于MeasureSpec中的說明是:

一個(gè)MeasureSpec封裝了從父容器傳遞給子容器的布局需求.

每一個(gè)MeasureSpec代表了一個(gè)寬度,或者高度的說明.

一個(gè)MeasureSpec是一個(gè)大小跟模式的組合值.一共有三種模式.

A MeasureSpec encapsulates the layout requirements passed from parent to child Each MeasureSpec represents a requirement for either the width or the height.A MeasureSpec is compsized of a size and a mode.There are three possible modes:

 (1)UPSPECIFIED :父容器對(duì)于子容器沒有任何限制,子容器想要多大就多大.
UNSPECIFIED The parent has not imposed any constraint on the child.It can be whatever size it wants

 (2) EXACTLY

 父容器已經(jīng)為子容器設(shè)置了尺寸,子容器應(yīng)當(dāng)服從這些邊界,不論子容器想要多大的空間.

EXACTLY The parent has determined and exact size for the child.The child is going to be given those bounds regardless of how big it wants to be.

(3) AT_MOST

 子容器可以是聲明大小內(nèi)的任意大小.

AT_MOST The child can be as large as it wants up to the specified size

MeasureSpec是View類下的靜態(tài)公開類,MeasureSpec中的值作為一個(gè)整型是為了減少對(duì)象的分配開支.此類用于

將size和mode打包或者解包為一個(gè)整型.

MeasureSpecs are implemented as ints to reduce object allocation.This class is provided to pack and unpack the size,mode tuple into the int

我比較好奇的是怎么樣將兩個(gè)值打包到一個(gè)int中,又如何解包.

MeasureSpec類代碼如下 :(注釋已經(jīng)被我刪除了,因?yàn)樵谏厦嬲f明了.)

01public static class MeasureSpec {
02    private static final int MODE_SHIFT = 30;
03    private static final int MODE_MASK  = 0x3 << MODE_SHIFT;
04 
05    public static final int UNSPECIFIED = 0 << MODE_SHIFT;
06    public static final int EXACTLY     = 1 << MODE_SHIFT;
07    public static final int AT_MOST     = 2 << MODE_SHIFT;
08 
09    public static int makeMeasureSpec(int size, int mode) {
10        return size + mode;
11    }
12    public static int getMode(int measureSpec) {
13        return (measureSpec & MODE_MASK);
14    }
15    public static int getSize(int measureSpec) {
16        return (measureSpec & ~MODE_MASK);
17    }  }

我無聊的將他們的十進(jìn)制值打印出來了:

mode_shift=30,mode_mask=-1073741824,UNSPECIFIED=0,EXACTLY=1073741824,AT_MOST=-2147483648

然后覺得也應(yīng)該將他們的二進(jìn)制值打印出來,如下:

mode_shift=11110, // 30

mode_mask=11000000000000000000000000000000,

UNSPECIFIED=0, 

EXACTLY=1000000000000000000000000000000, 

AT_MOST=10000000000000000000000000000000

 

1MODE_MASK  = 0x3 << MODE_SHIFT //也就是說MODE_MASK是由11左移30位得到的.因?yàn)镴ava用補(bǔ)碼表示數(shù)值.最后得到的值最高位是1所以就是負(fù)數(shù)了
1 
對(duì)于上面的數(shù)值我們應(yīng)該這樣想,不要把0x3看成3而要看成二進(jìn)制的11,

而把MODE_SHIFF就看成30.那為什么是二進(jìn)制 的11呢?

呢,因?yàn)橹挥腥髂J?如果有四種模式就是111了因?yàn)?11三個(gè)位才可以有四種組合對(duì)吧.

我們這樣來看,

UNSPECIFIED=00000000000000000000000000000000, 

      EXACTLY=01000000000000000000000000000000, 

    AT_MOST=10000000000000000000000000000000

也就是說,0,1,2

對(duì)應(yīng)   00,01,10

當(dāng)跟11想與時(shí)  00 &11 還是得到 00,11&01 -> 01,10&

我覺得到了這個(gè)份上相信,看我博客的也都理解了.

 return (measureSpec & ~MODE_MASK);應(yīng)該是 return (measureSpec & (~MODE_MASK));

posted on 2012-03-27 23:59 小果子 閱讀(19822) 評(píng)論(4)  編輯 收藏 引用 所屬分類: Android & Ios

FeedBack:
# re: android中onMeasure初看,深入理解布局之一!(轉(zhuǎn))
2012-07-18 13:37 | 小果子
@張?chǎng)?br>是的。  回復(fù)  更多評(píng)論
  
# re: android中onMeasure初看,深入理解布局之一!(轉(zhuǎn))
2012-10-08 18:31 | hello
# re: android中onMeasure初看,深入理解布局之一!(轉(zhuǎn))
2014-02-10 09:57 | JACK_WANG
@張?chǎng)?br>measureSpec 的高16位表示mode,低16位表示size。  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产手机视频一区二区| 亚洲欧美国产高清| 亚洲香蕉网站| 亚洲乱码国产乱码精品精天堂| 狠狠色伊人亚洲综合成人| 国产亚洲一区二区三区在线播放| 国产精品女主播一区二区三区| 国产精品久久久久9999吃药| 国产精品视频免费观看www| 国产欧美视频一区二区三区| 精品999网站| 亚洲免费观看高清完整版在线观看熊 | 久久精品综合| 久久国产精品毛片| 欧美在线一区二区| 久久精品国产清高在天天线| 久久伊伊香蕉| 亚洲激情亚洲| 午夜视频一区在线观看| 亚洲二区视频| 亚洲一区二区三区中文字幕| 亚洲一卡二卡三卡四卡五卡| 亚洲国产欧美一区二区三区同亚洲| 欧美亚洲在线观看| 99成人免费视频| 国产精品你懂的在线欣赏| 久久精品一二三区| 久久精品国产亚洲aⅴ| 91久久国产综合久久蜜月精品| 久久久免费精品视频| 亚洲国产激情| 国产亚洲欧洲| 欧美成在线观看| 免费视频一区| 一区二区高清在线观看| 浪潮色综合久久天堂| 欧美jizzhd精品欧美喷水| 亚洲欧美另类在线| 亚洲精品综合精品自拍| 久久久久久9| 亚洲自拍另类| 午夜在线视频观看日韩17c| 亚洲欧美福利一区二区| 在线视频一区观看| 亚洲综合首页| 亚洲一区免费网站| 亚洲大片精品永久免费| 免费不卡亚洲欧美| 亚洲电影av| 欧美在线黄色| 亚洲精品免费在线播放| 日韩午夜黄色| 久久美女性网| 国产一区免费视频| 激情综合色丁香一区二区| 欧美日韩喷水| 国产精品一区毛片| 在线看片一区| 99精品福利视频| 亚洲精品一品区二品区三品区| 一区免费观看视频| 在线播放亚洲一区| 欧美一区二区三区视频| 亚洲精品久久| 欧美日韩另类一区| 羞羞答答国产精品www一本| 亚洲激情啪啪| 久久九九全国免费精品观看| 亚洲欧洲精品一区| 99国产精品久久| 国产伦精品一区二区三| 久久久爽爽爽美女图片| 国产一区二区三区电影在线观看| 亚洲午夜三级在线| 99国产一区| 国产精品美腿一区在线看| 欧美一区二区精品| 久久精品在线免费观看| 亚洲人永久免费| 欧美精品97| 午夜精品国产更新| 久久免费视频这里只有精品| 午夜精品福利电影| 亚洲第一视频| 99精品视频免费全部在线| 欧美午夜在线视频| 久久亚洲精品视频| 欧美激情亚洲另类| 午夜精品久久久久久| 欧美在线三区| 亚洲美女视频在线免费观看| 亚洲一区二区久久| 亚洲国产精品久久久久| 一本到高清视频免费精品| 国产亚洲在线| 亚洲精品一区中文| 国产亚洲欧美一区二区三区| 亚洲国产另类精品专区| 久久精品国产第一区二区三区最新章节 | 国产精品一区二区三区四区| 久久久久久久激情视频| 欧美激情91| 老牛嫩草一区二区三区日本| 欧美日韩国产区| 久久久国产精品亚洲一区| 欧美精品综合| 美女精品网站| 国产日韩欧美日韩| 亚洲视频免费观看| 日韩亚洲精品在线| 鲁大师成人一区二区三区| 西瓜成人精品人成网站| 欧美美女福利视频| 欧美激情1区| 国产综合精品| 性亚洲最疯狂xxxx高清| 亚洲综合色网站| 欧美日韩妖精视频| 亚洲韩国青草视频| 黄页网站一区| 香蕉久久国产| 欧美亚洲综合另类| 国产精品日韩精品欧美在线| 一本色道久久加勒比88综合| 亚洲国产小视频在线观看| 欧美一区二区在线播放| 性做久久久久久久免费看| 国产精品国产一区二区| 亚洲人妖在线| 中文久久乱码一区二区| 欧美剧在线免费观看网站| 欧美aⅴ99久久黑人专区| 国产永久精品大片wwwapp| 亚洲欧美日韩在线播放| 欧美一区在线直播| 国产精品综合色区在线观看| 亚洲综合色网站| 欧美亚洲免费| 国产一区日韩欧美| 欧美在线|欧美| 亚洲精品视频免费在线观看| 久久综合影视| 亚洲激情亚洲| 夜夜夜精品看看| 欧美午夜影院| 亚洲在线第一页| 久久成人在线| 国产综合色在线| 久久琪琪电影院| 亚洲国产精品久久久久秋霞蜜臀| 激情国产一区| 欧美韩日视频| 亚洲午夜在线视频| 久久精品综合网| 91久久精品国产91久久性色tv| 欧美黑人国产人伦爽爽爽| 日韩西西人体444www| 欧美在线观看网站| 亚洲激情av| 国产精品第2页| 久久爱另类一区二区小说| 欧美成人伊人久久综合网| 一区二区三区日韩欧美精品| 国产精品爽爽ⅴa在线观看| 欧美伊人久久久久久久久影院| 免费成人性网站| 日韩亚洲精品电影| 国产综合久久| 欧美日韩一本到| 久久久中精品2020中文| 亚洲日本中文字幕| 久久精品国产69国产精品亚洲| 亚洲精品国产精品乱码不99按摩| 国产精品www网站| 另类春色校园亚洲| 一本色道**综合亚洲精品蜜桃冫 | 性色一区二区三区| 亚洲精品色图| 国产情侣一区| 欧美日韩精品久久| 久久不射2019中文字幕| 9i看片成人免费高清| 久久亚洲精品视频| 亚洲欧美日韩区| 亚洲黄色成人网| 国产综合一区二区| 国产精品网站一区| 欧美体内谢she精2性欧美| 久久亚洲捆绑美女| 欧美一二区视频| 日韩亚洲精品电影| 欧美jjzz| 久久综合九色99| 久久激情久久| 香蕉久久国产| 亚洲一区久久| 亚洲视频自拍偷拍| av成人免费观看| 亚洲激情影院| 亚洲国产一区二区三区a毛片 |