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

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 小果子 閱讀(19820) 評(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>
            亚洲影院高清在线| 欧美与黑人午夜性猛交久久久| 夜夜嗨av一区二区三区网页| 亚洲一区二区成人| 欧美一级专区免费大片| 国产一区二区三区免费观看| 久久亚洲一区| 欧美本精品男人aⅴ天堂| 国产日韩av在线播放| 午夜激情久久久| 久久夜色精品一区| 亚洲三级免费| 国产精品成人aaaaa网站| 午夜精品久久久久久99热| 美女尤物久久精品| 日韩亚洲欧美一区二区三区| 国产欧美精品日韩精品| 欧美福利视频一区| 一区二区欧美精品| 久久免费偷拍视频| 中国成人亚色综合网站| 国产亚洲欧美一区二区| 欧美日韩成人精品| 久久精品国产久精国产思思| 欧美激情一区二区三区| 久久香蕉国产线看观看av| 伊大人香蕉综合8在线视| 欧美日韩国产成人在线91| 亚洲综合三区| 亚洲图中文字幕| 亚洲精品免费一区二区三区| 午夜国产精品视频免费体验区| 国产精品亚洲综合色区韩国| 国产精品国码视频| 欧美福利视频在线| 欧美日韩美女一区二区| 久久精品99| 亚洲一区制服诱惑| 激情校园亚洲| 欧美日韩调教| 欧美日韩美女一区二区| 欧美午夜不卡视频| 欧美日韩精品在线观看| 亚洲精品色婷婷福利天堂| 欧美视频第二页| 久久久精品tv| 久久久久综合一区二区三区| 午夜宅男久久久| 久久综合色婷婷| 欧美亚洲综合久久| 亚洲国产精品高清久久久| 亚洲欧美日韩一区二区在线| 亚洲精品久久| 一区二区免费在线观看| 亚洲电影av| 久久亚洲综合网| 欧美在线观看一区| 欧美日韩综合一区| 亚洲人成网站在线播| 亚洲国产精品成人一区二区| 亚洲影视在线| 久久av在线| 黄色精品一区| 西西裸体人体做爰大胆久久久| 在线综合亚洲| 久久精品1区| 久久久久久久久久码影片| 欧美成人一区二区| 亚洲国产三级| 欧美三区在线视频| 欧美一区二区三区精品| 欧美日韩一区二区视频在线| 欧美日本一区| 欧美人在线观看| 亚洲国产精品一区二区www| 国产精品丝袜xxxxxxx| 久久久人成影片一区二区三区| 亚洲视频在线二区| 久久久噜噜噜久噜久久| 欧美精品v日韩精品v韩国精品v| 亚洲国产mv| 欧美有码视频| 久久综合狠狠综合久久综合88| 国产欧美日韩综合| 国产精品久久中文| 亚洲视频在线看| 91久久久亚洲精品| 亚洲精品网站在线播放gif| 日韩视频精品在线| 亚洲欧美资源在线| 亚洲欧美日韩精品久久| 亚洲国产精品国自产拍av秋霞 | 亚洲国产免费| 日韩亚洲欧美中文三级| 欧美区在线播放| 亚洲日本欧美| 亚洲视频一二三| 99在线视频精品| 欧美福利一区| 久久午夜电影网| 欧美黄色aa电影| 久久亚洲视频| 欧美日韩 国产精品| 亚洲成在人线av| 亚洲精品国产精品国自产观看| 欧美色图五月天| 一区在线观看| 一区二区久久| 久久久精品午夜少妇| 亚洲春色另类小说| 亚洲一区高清| 在线性视频日韩欧美| 蜜臀a∨国产成人精品| 久久久精品日韩欧美| 欧美日韩和欧美的一区二区| 久久精品国产91精品亚洲| 麻豆av一区二区三区久久| 亚洲一区二区三区午夜| 你懂的国产精品永久在线| 欧美日韩一区二区视频在线观看| 亚洲国产精品成人久久综合一区| 久久久人成影片一区二区三区| 久久精品一区二区三区不卡| 国产女主播一区二区三区| 欧美久久电影| 亚洲免费观看高清完整版在线观看熊| 欧美先锋影音| 亚洲图片自拍偷拍| 亚洲色诱最新| 红桃视频亚洲| 久久国产88| 久久综合色影院| 欧美fxxxxxx另类| 亚洲欧洲一区二区天堂久久| 久久久亚洲欧洲日产国码αv| 欧美日韩精品免费观看视频| 国产精品欧美久久久久无广告| 国产欧美另类| 亚洲福利视频网| 久久精品首页| 国产精品热久久久久夜色精品三区| 亚洲日本成人在线观看| 亚洲美女视频在线观看| 欧美va亚洲va国产综合| 国产日韩精品入口| 亚洲欧洲日本在线| 午夜在线视频观看日韩17c| 久久国产婷婷国产香蕉| 亚洲欧美综合v| 国产精品欧美久久| 亚洲人成网站在线观看播放| 亚洲第一中文字幕| 久久九九国产精品| 狂野欧美激情性xxxx欧美| 悠悠资源网亚洲青| 欧美精品一区二区高清在线观看| 欧美成人按摩| 亚洲香蕉成视频在线观看| 欧美绝品在线观看成人午夜影视| 欧美国产精品v| 国产精品久久九九| 欧美在线视频全部完| 久久久久久精| 亚洲在线中文字幕| 欧美大片网址| 亚洲天堂免费观看| 欧美人与禽猛交乱配| 狠狠色狠狠色综合日日tαg| 亚洲全黄一级网站| 久久综合激情| 欧美一区二区黄| 亚洲国产日本| 亚洲欧美国产一区二区三区| 欧美日韩国产精品成人| 亚洲精品久久嫩草网站秘色| 你懂的国产精品| 久久久久九九视频| 国产一区二区高清视频| 久久精品国产免费| 亚洲欧美日韩第一区| 国产精品综合av一区二区国产馆| 9国产精品视频| 亚洲清纯自拍| 国产精品v日韩精品| 亚洲视频一二区| 一区二区三区偷拍| 国产一区二区三区四区hd| 午夜激情一区| 久久久久久久性| 国产一区二区在线观看免费播放| 午夜在线精品偷拍| 欧美亚洲综合另类| 亚洲激情六月丁香| 亚洲男人的天堂在线| 在线播放国产一区中文字幕剧情欧美 | 欧美国产三区| 欧美性做爰毛片| 免费短视频成人日韩| 欧美性大战久久久久久久蜜臀| 篠田优中文在线播放第一区|