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

xiaoguozi's Blog
Pay it forword - 我并不覺的自豪,我所嘗試的事情都失敗了······習慣原本生活的人不容易改變,就算現狀很糟,他們也很難改變,在過程中,他們還是放棄了······他們一放棄,大家就都是輸家······讓愛傳出去,很困難,也無法預料,人們需要更細心的觀察別人,要隨時注意才能保護別人,因為他們未必知道自己要什么·····

今天學習android自定義組件:docs/guide/topics/ui/custom-components.html

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

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

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

實現onMeasure()方法基本需要完成下面三個方面的事情(最終結果是你自己寫相應代碼得出測量值并調用view的一個方法進行設置,告訴給你的view安排位置大小的父容器你要多大的空間.):

1.傳遞進來的參數,widthMeasureSpec,和heightMeasureSpec是你對你應該得出來的測量值的限制.

 

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計算出來設置的width和height將被用來渲染組件.應當盡量在傳遞進來的width和height 聲明之間.

雖然你也可以選擇你設置的尺寸超過傳遞進來的聲明.但是這樣的話,父容器可以選擇,如clipping,scrolling,或者拋出異常,或者(也許是用新的聲明參數)再次調用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計算好了,就應該調用View.setMeasuredDimension(int width,int height)方法,否則將導致拋出異常.
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提提供的一個自定義View示例中(在API demos 中的 view/LabelView)可以看到一個重寫onMeasure()方法的

實例,也比較好理解.

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()

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

android2.2文檔中對于MeasureSpec中的說明是:

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

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

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

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 :父容器對于子容器沒有任何限制,子容器想要多大就多大.
UNSPECIFIED The parent has not imposed any constraint on the child.It can be whatever size it wants

 (2) EXACTLY

 父容器已經為子容器設置了尺寸,子容器應當服從這些邊界,不論子容器想要多大的空間.

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

 子容器可以是聲明大小內的任意大小.

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

MeasureSpec是View類下的靜態公開類,MeasureSpec中的值作為一個整型是為了減少對象的分配開支.此類用于

將size和mode打包或者解包為一個整型.

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

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

MeasureSpec類代碼如下 :(注釋已經被我刪除了,因為在上面說明了.)

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    }  }

我無聊的將他們的十進制值打印出來了:

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

然后覺得也應該將他們的二進制值打印出來,如下:

mode_shift=11110, // 30

mode_mask=11000000000000000000000000000000,

UNSPECIFIED=0, 

EXACTLY=1000000000000000000000000000000, 

AT_MOST=10000000000000000000000000000000

 

1MODE_MASK  = 0x3 << MODE_SHIFT //也就是說MODE_MASK是由11左移30位得到的.因為Java用補碼表示數值.最后得到的值最高位是1所以就是負數了
1 
對于上面的數值我們應該這樣想,不要把0x3看成3而要看成二進制的11,

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

呢,因為只有三各模式,如果有四種模式就是111了因為111三個位才可以有四種組合對吧.

我們這樣來看,

UNSPECIFIED=00000000000000000000000000000000, 

      EXACTLY=01000000000000000000000000000000, 

    AT_MOST=10000000000000000000000000000000

也就是說,0,1,2

對應   00,01,10

當跟11想與時  00 &11 還是得到 00,11&01 -> 01,10&

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

 return (measureSpec & ~MODE_MASK);應該是 return (measureSpec & (~MODE_MASK));

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

FeedBack:
# re: android中onMeasure初看,深入理解布局之一!(轉)
2012-07-13 16:44 | 張鑫
其實說得簡單點,int是32位的,在MeasureSpec中維護了一個int值(mode+size),其中最高兩位表示mode,后面30位是表示size,所以為什么MODE_SHIFT是30.  回復  更多評論
  
# re: android中onMeasure初看,深入理解布局之一!(轉)
2012-07-18 13:37 | 小果子
@張鑫
是的。  回復  更多評論
  
# re: android中onMeasure初看,深入理解布局之一!(轉)
2012-10-08 18:31 | hello
不懂  回復  更多評論
  
# re: android中onMeasure初看,深入理解布局之一!(轉)
2014-02-10 09:57 | JACK_WANG
@張鑫
measureSpec 的高16位表示mode,低16位表示size。  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            在线播放精品| 国产精品成av人在线视午夜片| 国产欧美综合在线| 久久久91精品国产一区二区精品| 欧美xx69| 午夜欧美电影在线观看| 国产视频一区在线| 国产欧美在线播放| 国产精品久久久久久久app| 美女国产精品| 欧美成人免费在线| 久久中文在线| 在线亚洲观看| 欧美一区二区三区在线播放| 最新高清无码专区| 久久狠狠亚洲综合| 欧美夜福利tv在线| 亚洲一区国产精品| 夜夜嗨av色综合久久久综合网 | 久久婷婷国产综合精品青草| 亚洲国产91精品在线观看| 国产精品久久91| 国内精品免费在线观看| 国产一区二区三区高清| 在线国产日韩| 欧美一区二区大片| 亚洲国产毛片完整版| 欧美亚洲视频一区二区| 久久综合九色九九| 国产精品视频免费观看| 亚洲精品在线视频| 美女免费视频一区| 欧美一区1区三区3区公司| 欧美巨乳在线| 亚洲欧洲另类国产综合| 久久精品欧洲| 亚洲小说欧美另类社区| 欧美日韩国产色站一区二区三区| 国产精品色午夜在线观看| 亚洲欧洲另类| 欧美激情第二页| 免费成年人欧美视频| 亚洲国产精品久久久久久女王| 久久精品视频播放| 午夜伦欧美伦电影理论片| 欧美国产一区在线| 亚洲精选一区| 99视频在线精品国自产拍免费观看 | 狼狼综合久久久久综合网| 亚洲精品国产精品国自产在线| 午夜在线精品偷拍| 欧美大香线蕉线伊人久久国产精品| 欧美激情麻豆| 一区二区亚洲精品| 国产精品一卡| 久久gogo国模啪啪人体图| 性8sex亚洲区入口| 国产精品久久久久久久7电影| 91久久精品国产91久久性色| 久久全球大尺度高清视频| 欧美插天视频在线播放| 亚洲欧美国产日韩中文字幕| 欧美一区二区免费视频| 亚洲免费观看| 欧美制服丝袜| 一本大道久久a久久精二百| 久久gogo国模裸体人体| 午夜精品久久久久久久久久久久久 | 国产亚洲成人一区| 91久久精品日日躁夜夜躁欧美 | 国产精品久久久久久久一区探花 | 亚洲成色最大综合在线| 亚洲综合色在线| 午夜精品福利一区二区三区av| 欧美激情精品久久久久| 欧美/亚洲一区| 香蕉亚洲视频| 国产偷久久久精品专区| 久久久国产亚洲精品| 乱人伦精品视频在线观看| 亚洲高清视频在线| 亚洲美女黄色| 美女主播一区| 男女激情久久| 亚洲国产精品精华液2区45| 欧美色综合天天久久综合精品| 激情亚洲一区二区三区四区| 亚洲美洲欧洲综合国产一区| 尤妮丝一区二区裸体视频| 毛片av中文字幕一区二区| 女生裸体视频一区二区三区 | 久久久久国产一区二区三区| 国产精品无码永久免费888| 久久婷婷国产麻豆91天堂| 欧美日韩一区二区欧美激情| 亚洲精品一区二区网址 | 国产精品久久777777毛茸茸| 99精品久久久| 另类国产ts人妖高潮视频| 亚洲最新在线| 国内一区二区三区| 免费av成人在线| 午夜国产一区| 99av国产精品欲麻豆| 蜜臀av一级做a爰片久久| 亚洲一区www| 亚洲伦理在线观看| 亚洲盗摄视频| 极品日韩av| 国产在线视频欧美| 国产精品电影观看| 欧美精品福利| 欧美~级网站不卡| 久久亚洲欧美| 久久婷婷国产综合尤物精品 | 久久综合网络一区二区| 亚洲女同在线| 欧美在线视频播放| 欧美有码在线观看视频| 欧美一级大片在线免费观看| 夜夜嗨av色综合久久久综合网| 亚洲国产精品精华液2区45 | 激情懂色av一区av二区av| 国产精品高潮呻吟久久av黑人| 欧美精选午夜久久久乱码6080| 裸体一区二区| 欧美日韩亚洲成人| 国产精品揄拍一区二区| 国产精品免费视频xxxx| 欧美午夜电影在线| 国产久一道中文一区| 黄色综合网站| 亚洲毛片播放| 久久黄色影院| 亚洲国产成人在线| 一本一道久久综合狠狠老精东影业 | 国产亚洲一二三区| 亚洲国产精品成人精品| 日韩午夜免费视频| 久久久久国产精品www| 欧美激情一区二区三区不卡| 亚洲视频免费在线| 欧美激情视频给我| 狠狠色丁香久久婷婷综合丁香| 99综合电影在线视频| 免费成人黄色片| 午夜亚洲福利在线老司机| 欧美日产国产成人免费图片| 一区二区三区在线视频播放| 亚洲深夜激情| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 亚洲精品综合久久中文字幕| 久久精品国产亚洲精品| 亚洲午夜一区二区| 欧美日韩一区二区三区| 一本色道久久综合亚洲精品按摩| 欧美成人日韩| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美一级在线视频| 国内成+人亚洲| 亚洲精品国精品久久99热| 欧美三级网页| 欧美福利一区二区| 国内久久视频| 香蕉乱码成人久久天堂爱免费| 一区二区三区免费网站| 蜜臀av国产精品久久久久| 久久九九精品| 国语自产精品视频在线看| 亚洲婷婷免费| 亚洲免费在线观看视频| 欧美日韩视频在线| 99re66热这里只有精品4| 一区二区三区回区在观看免费视频| 久久婷婷麻豆| 亚洲级视频在线观看免费1级| 亚洲伦理精品| 亚洲一区二区三区在线视频| 欧美日韩欧美一区二区| 一区二区三区成人| 亚洲欧美日韩精品一区二区| 国产精品你懂的在线欣赏| 亚洲无限av看| 久久精品中文| 亚洲精选在线观看| 欧美午夜精品久久久久久孕妇| 亚洲尤物精选| 欧美激情视频一区二区三区在线播放 | 99re66热这里只有精品4| 99riav国产精品| 国产欧美一区二区精品仙草咪| 欧美色道久久88综合亚洲精品| 亚洲欧美精品| 亚洲电影免费观看高清| 亚洲自拍啪啪| 亚洲第一精品夜夜躁人人爽| 欧美激情91| 亚洲欧美日韩天堂| 久久青草福利网站| 99在线精品免费视频九九视|