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

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

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

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

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

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

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

1.傳遞進來的參數(shù),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,或者拋出異常,或者(也許是用新的聲明參數(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計算好了,就應該調(diào)用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()

首先看到的是參數(shù),分別代表寬度和高度的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

 父容器已經(jī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中的值作為一個整型是為了減少對象的分配開支.此類用于

將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類代碼如下 :(注釋已經(jīng)被我刪除了,因為在上面說明了.)

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用補碼表示數(shù)值.最后得到的值最高位是1所以就是負數(shù)了
1 
對于上面的數(shù)值我們應該這樣想,不要把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 小果子 閱讀(19822) 評論(4)  編輯 收藏 引用 所屬分類: Android & Ios

FeedBack:
# re: android中onMeasure初看,深入理解布局之一!(轉(zhuǎn))
2012-07-13 16:44 | 張鑫
其實說得簡單點,int是32位的,在MeasureSpec中維護了一個int值(mode+size),其中最高兩位表示mode,后面30位是表示size,所以為什么MODE_SHIFT是30.  回復  更多評論
  
# re: android中onMeasure初看,深入理解布局之一!(轉(zhuǎn))
2012-07-18 13:37 | 小果子
@張鑫
是的。  回復  更多評論
  
# re: android中onMeasure初看,深入理解布局之一!(轉(zhuǎn))
2012-10-08 18:31 | hello
不懂  回復  更多評論
  
# re: android中onMeasure初看,深入理解布局之一!(轉(zhuǎn))
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>
            91久久夜色精品国产网站| 久久精品国产亚洲一区二区三区| 一本色道久久精品| 中文国产成人精品久久一| 亚洲欧美综合国产精品一区| 亚洲国产日韩一区| 午夜精品一区二区在线观看| 麻豆成人小视频| 国产欧美日韩免费| 亚洲毛片一区| 久久国产日韩欧美| 亚洲国产小视频| 久久综合色综合88| 久久国产99| 亚洲精品中文字幕有码专区| 欧美成人高清| 欧美www在线| 国产精品视频免费| 亚洲高清在线| 欧美一区激情| 欧美成人精品福利| 女人色偷偷aa久久天堂| 亚洲另类春色国产| 伊人久久亚洲热| 亚洲欧美日韩国产综合在线 | 日韩亚洲欧美中文三级| 亚洲国产精品久久久久| 久久精品99国产精品| 亚洲无限av看| 欧美三级黄美女| 一本久道久久综合中文字幕| 在线中文字幕一区| 亚洲激情婷婷| 欧美国产精品久久| 亚洲第一视频网站| 国产日韩欧美在线播放不卡| 欧美二区在线播放| av不卡在线观看| 久久久久久久999| 欧美在线一级va免费观看| 亚洲欧美日韩人成在线播放| 欧美色图一区二区三区| 一本高清dvd不卡在线观看| 亚洲国产一区二区三区青草影视 | 久久久www成人免费精品| 久久久久九九视频| 永久域名在线精品| 乱人伦精品视频在线观看| 欧美综合二区| 国产精品乱码一区二区三区 | 欧美影院视频| 欧美在线免费| 在线观看日产精品| 亚洲国产精品成人| 欧美日韩国产精品专区| 亚洲免费在线精品一区| 国产欧美一区二区白浆黑人| 欧美一区91| 国产一区二区在线观看免费播放| 一区二区三欧美| 日韩视频免费观看高清在线视频 | 小辣椒精品导航| 久久精品官网| 亚洲精品国产精品乱码不99按摩 | 欧美性大战xxxxx久久久| 久久精品国产96久久久香蕉 | 国产精品乱子乱xxxx| 免费观看不卡av| 欧美成人自拍| 亚洲免费在线观看| 91久久精品美女高潮| 国产欧美亚洲视频| 亚洲第一区在线观看| 国产精品国产三级国产普通话99 | 亚洲视频二区| 欧美一区二区三区视频免费| 国产精品一区视频| 亚洲视频在线一区| 亚洲一区二区三区国产| 国产在线精品一区二区夜色| 欧美大片18| 免费在线成人av| 久久久久久久网站| 欧美日本一道本| 久久久久国产精品www| 国产精品久久久久久久久久ktv| 久久久久久久久久久久久女国产乱| 久热精品在线| 久久婷婷久久| 国产精品久久久久77777| 免费日韩精品中文字幕视频在线| 亚洲精品久久久久中文字幕欢迎你 | 午夜免费久久久久| 国产欧美综合一区二区三区| 国产精品中文在线| 欧美日韩一区高清| 美玉足脚交一区二区三区图片| 国产一二三精品| 久久婷婷影院| 亚洲愉拍自拍另类高清精品| 性欧美18~19sex高清播放| 国产欧美日本一区二区三区| 一区二区三区色| 亚洲国产精品va在线观看黑人| 亚洲免费视频网站| 国产精品嫩草99a| 亚洲素人一区二区| 一区二区三区精品视频| 欧美福利专区| 亚洲激情图片小说视频| 欧美一区成人| 国产精品综合色区在线观看| 亚洲综合视频网| 性刺激综合网| 国产视频一区在线| 久久久午夜精品| 欧美高清不卡在线| 一区在线观看| 欧美不卡视频一区| 欧美日韩视频专区在线播放| 快she精品国产999| 久久久噜噜噜久久| 国产丝袜美腿一区二区三区| 亚洲视频图片小说| 夜夜嗨av一区二区三区| 亚洲少妇诱惑| 久久动漫亚洲| 激情久久综艺| 欧美激情视频在线播放 | 巨胸喷奶水www久久久免费动漫| 亚洲国产一区二区三区高清 | 亚洲性感激情| 中文欧美在线视频| 久久综合久色欧美综合狠狠| 欧美一区二区三区在| 久久福利电影| 香蕉久久一区二区不卡无毒影院 | 欧美日韩中文字幕精品| 在线欧美电影| 欧美中文字幕视频在线观看| 玖玖玖国产精品| 性色一区二区| 亚洲激情在线视频| 午夜精品剧场| 亚洲国产日本| 日韩一级大片在线| 99视频精品免费观看| 欧美日本免费一区二区三区| av成人黄色| 欧美成人午夜77777| 雨宫琴音一区二区在线| 免费的成人av| 午夜一级在线看亚洲| 国模私拍一区二区三区| 欧美18av| 先锋资源久久| 一区二区三区视频在线看| 欧美日韩高清在线播放| 免费在线观看一区二区| 欧美激情一区二区| 久久躁狠狠躁夜夜爽| 欧美在线视频二区| 亚洲午夜国产一区99re久久| 韩国一区二区三区美女美女秀| 欧美日韩一级黄| 亚洲欧洲精品成人久久奇米网| 国产精品va在线| 免费成人性网站| 欧美一区二区三区四区夜夜大片 | 性做久久久久久久久| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美午夜电影在线| 亚洲欧美一区二区视频| 国产精品视频一二| 久久狠狠亚洲综合| 亚洲午夜精品17c| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美日韩视频专区在线播放| 久久综合久久综合这里只有精品 | 亚洲国产精品一区二区第四页av| 性做久久久久久免费观看欧美| 欧美国产精品专区| 欧美在线三级| 亚洲综合大片69999| 亚洲色诱最新| 亚洲欧美综合v| 午夜精品剧场| 好看的日韩视频| 亚洲一区视频在线| 欧美一级淫片播放口| 亚洲日本国产| 欧美大片在线看| 亚洲一区二区三区四区中文| 欧美激情国产日韩| 美女图片一区二区| 久热re这里精品视频在线6| 91久久黄色| 亚洲人成在线播放| 国产亚洲福利社区一区| 久久久在线视频|