導航:首頁 > 操作系統 > 安卓measure如何使用

安卓measure如何使用

發布時間:2022-09-27 03:25:27

android是怎樣繪制視圖的

當一個活動接收到焦點時,它將被要求繪制它的布局。Android框架將處理這個繪畫的過程,但是活動必須提供它的布局層次的根節點。

繪畫從布局的根節點開始。它被要求來測量和繪制布局樹。繪畫通過遍歷布局樹並渲染每個和失效區域相交的視圖來處理。相應的,每個視圖組負責請求繪制它的子視圖(通過draw() 方法)而每個視圖負責畫它自己。因為這個樹是順序遍歷的,這意味著先畫父節點(也就是在屏幕後面),然後按照樹中出現的順序畫其同層次節點。

框架將不會畫不在失效區域的視圖,而且還將會幫你畫視圖背景。

你可以強制一個視圖被重畫,通過調用invalidate()。

繪畫布局共有兩步:一個度量過程和一個布局過程。度量過程在measure(int, int)里實現且是一個自頂向下的視圖樹遍歷。每個視圖在遞歸時往下推送尺寸規格。在度量過程的最後,每個視圖都已經保存了自己的度量。第二個過程發生在layout(int, int, int, int) 中並且也是自頂向下。在這個過程中,每個父節點負責定位它的所有子節點,通過使用在度量過程中計算得到的尺寸。

當一個視圖的measure()方法返回時,它的getMeasuredWidth()和getMeasuredHeight() 值必須被設置,以及所有這個視圖子節點的值。一個視圖的度量的寬度和高度值必須符合父視圖引入的限制。這確保在度量過程之後,所有父節點接受所有它們的子節點的度量值。一個父視圖可能會在其子視圖上多次調用measure()方法。比如,父視圖可能會通過未指定的尺寸調用measure來發現它們的大小,然後使用實際數值再次調用measure(),如果所有子視圖未做限制的尺寸總合過大或過小(也即是,如果子視圖之間不能對各自占據的空間達成共識的話,父視圖將會干預並設置第二個過程的規則)。

要開始一個布局,可調用requestLayout()。這個方法通常在視圖認為它自己不再適合它當前的邊界的情況下被調用。

度量過程使用兩個類來交流尺寸。View.MeasureSpec類被視圖用來告訴它們的父視圖它們想如何被度量和定位。基礎的LayoutParams類僅僅描述了視圖想有多大(高和寬)。對於每個維度,它可以指定下面之一:

❷ Android 自定義View中onMeasure中使用resolveSize是什麼意思

onmeasure方法主要是測量控制項本身的大小(width,height)以及它的子控制項的大小
不太明白你說的畫布大小,但ondraw需要畫的所有東西的大小,都要在onmeasure中測量獲取

❸ Android:onmeasure()與measure()兩方法有什麼區 別

measure只有View類中才有這個方法,也就是說所有的View,像LinearLayout、Button這些控制項的measure方法都是從View繼承的,onMeasure方法才是真正的測量控制項大小的方法,是由View的子類實現的,onMeasure是在measure方法中調用的

❹ Android問題:自定義視圖的時候,onMeasure()這個方法有什麼用

描述View本身大小的多少!

自定義View的時候重載onMeasure(),onLayout(),onDraw()三個函數構建了自定義View的外觀形象。再加上onTouchEvent()等重載視圖的行為,可以構建任何我們需要的可感知到的自定義View。

我們知道,不管是自定義View還是系統提供的TextView這些,它們都必須放置在LinearLayout等一些ViewGroup中,因此理論上我們可以很好的理解onMeasure(),onLayout(),onDraw()這三個函數:1.View本身大小多少,這由onMeasure()決定;2.View在ViewGroup中的位置如何,這由onLayout()決定;3.繪制View,onDraw()定義了如何繪制這個View。

❺ android手機布局,這個篩選布局該怎麼樣設置控制項新手求大神講解。。

ViewGroup在onLayout函數中通過調用其children的layout函數來設置子視圖相對與父視圖中的位置,具體位置由函數layout的參數決定,當我們繼承ViewGroup時必須重載onLayout函數(ViewGroup中onLayout是abstract修飾),然而onMeasure並不要求必須重載,因為相對與layout來說,measure過程並不是必須的,具體後面會提到。首先我們來看下View.java中函數layout和onLayout的源碼:public void layout(int l, int t, int r, int b) { int oldL = mLeft; int oldT = mTop; int oldB = mBottom; int oldR = mRight; boolean changed = setFrame(l, t, r, b); if (changed || (mPrivateFlags & LAYOUT_REQUIRED) == LAYOUT_REQUIRED) { if (ViewDebug.TRACE_HIERARCHY) { ViewDebug.trace(this, ViewDebug.HierarchyTraceType.ON_LAYOUT); } onLayout(changed, l, t, r, b); mPrivateFlags &= ~LAYOUT_REQUIRED; ListenerInfo li = mListenerInfo; if (li != null && li.mOnLayoutChangeListeners != null) { ArrayList<OnLayoutChangeListener> listenersCopy = (ArrayList<OnLayoutChangeListener>)li.mOnLayoutChangeListeners.clone(); int numListeners = listenersCopy.size(); for (int i = 0; i < numListeners; ++i) { listenersCopy.get(i).onLayoutChange(this, l, t, r, b, oldL, oldT, oldR, oldB); } } } mPrivateFlags &= ~FORCE_LAYOUT; }函數layout的主體過程還是很容易理解的,首先通過調用setFrame函數來對4個成員變數(mLeft,mTop,mRight,mBottom)賦值,然後回調onLayout函數,最後回調所有注冊過的listener的onLayoutChange函數。 對於View來說,onLayout只是一個空實現,一般情況下我們也不需要重載該函數:protected void onLayout(boolean changed, int left, int top, int right, int bottom) { }接著我們來看下ViewGroup.java中layout的源碼:public final void layout(int l, int t, int r, int b) { if (mTransition == null || !mTransition.isChangingLayout()) { super.layout(l, t, r, b); } else { // record the fact that we noop'd it; request layout when transition finishes mLayoutSuppressed = true; } }super.layout(l, t, r, b)調用的即是View.java中的layout函數,相比之下ViewGroup增加了LayoutTransition的處理,LayoutTransition是用於處理ViewGroup增加和刪除子視圖的動畫效果,也就是說如果當前ViewGroup未添加LayoutTransition動畫,或者LayoutTransition動畫此刻並未運行,那麼調用super.layout(l, t, r, b),繼而調用到ViewGroup中的onLayout,否則將mLayoutSuppressed設置為true,等待動畫完成時再調用requestLayout()。 上面super.layout(l, t, r, b)會調用到ViewGroup.java中onLayout,其源碼實現如下: @Override protected abstract void onLayout(boolean changed, int l, int t, int r, int b);和前面View.java中的onLayout實現相比,唯一的差別就是ViewGroup中多了關鍵字abstract的修飾,也就是說ViewGroup類只能用來被繼承,無法實例化,並且其子類必須重載onLayout函數,而重載onLayout的目的就是安排其children在父視圖的具體位置。重載onLayout通常做法就是起一個for循環調用每一個子視圖的layout(l, t, r, b)函數,傳入不同的參數l, t, r, b來確定每個子視圖在父視圖中的顯示位置。 那layout(l, t, r, b)中的4個參數l, t, r, b如何來確定呢?聯想到之前的measure過程,measure過程的最終結果就是確定了每個視圖的mMeasuredWidth和mMeasuredHeight,這兩個參數可以簡單理解為視圖期望在屏幕上顯示的寬和高,而這兩個參數為layout過程提供了一個很重要的依據(但不是必須的),為了說明這個過程,我們來看下LinearLayout的layout過程:void layoutVertical() { …… for (int i = 0; i < count; i++) { final View child = getVirtualChildAt(i); if (child == null) { childTop += measureNullChild(i); } else if (child.getVisibility() != GONE) { final int childWidth = child.getMeasuredWidth(); final int childHeight = child.getMeasuredHeight(); …… setChildFrame(child, childLeft, childTop + getLocationOffset(child), childWidth, childHeight); childTop += childHeight + lp.bottomMargin + getNextLocationOffset(child); i += getChildrenSkipCount(child, i); } } } private void setChildFrame(View child, int left, int top, int width, int height) { child.layout(left, top, left + width, top + height); }從setChildFrame可以看到LinearLayout中的子視圖的右邊界等於left + width,下邊界等於top+height,也就是說在LinearLayout中其子視圖顯示的寬和高由measure過程來決定的,因此measure過程的意義就是為layout過程提供視圖顯示範圍的參考值。 layout過程必須要依靠measure計算出來的mMeasuredWidth和mMeasuredHeight來決定視圖的顯示大小嗎?事實並非如此,layout過程中的4個參數l, t, r, b完全可以由視圖設計者任意指定,而最終視圖的布局位置和大小完全由這4個參數決定,measure過程得到的mMeasuredWidth和mMeasuredHeight提供了視圖大小的值,但我們完全可以不使用這兩個值,可見measure過程並不是必須的。\\ 說到這里就不得不提getWidth()、getHeight()和getMeasuredWidth()、getMeasuredHeight()這兩對函數之間的區別,getMeasuredWidth()、getMeasuredHeight()返回的是measure過程得到的mMeasuredWidth和mMeasuredHeight的值,而getWidth()和getHeight()返回的是mRight - mLeft和mBottom - mTop的值,看View.java中的源碼便一清二楚了:public final int getMeasuredWidth() { return mMeasuredWidth & MEASURED_SIZE_MASK; } public final int getWidth() { return mRight - mLeft; }這也解釋了為什麼有些情況下getWidth()和getMeasuredWidth()以及getHeight()和getMeasuredHeight()會得到不同的值。

❻ android onmeasure什麼時候調用

在開發中,當Android原生控制項不能滿足我們的需求的時候,就需要自定義View。View在屏幕上繪制出來先要經過measure(計算)和layout(布局)。
什麼時候調用onMeasure方法?
當子View的父控制項要放置該View的時候,父控制項會傳遞兩個參數給View——widthMeasureSpec和heightMeasureSpec。這兩個參數是View可以獲取的寬高尺寸和模式 混合的int數據。可以通過int mode = MeasureSpec.getMode(widthMeasureSpec)得到模式,用int size = MeasureSpec.getSize(widthMeasureSpec)得到尺寸。
mode共有三種情況,取 分別為
MeasureSpec.UNSPECIFIED,MeasureSpec.EXACTLY,MeasureSpec.AT_MOST。
MeasureSpec.EXACTLY是精確尺寸,當我們將控制項的layout_width或layout_height指定為具體數 時如
andorid:layout_width="50dip",或者為FILL_PARENT是,都是控制項大小已經確定的情況,都是精確尺寸。
MeasureSpec.AT_MOST是最大尺寸,當控制項的layout_width或layout_height指定為WRAP_CONTENT時,控制項大小一般隨著控制項的子空間或內容進行變化,此時控制項尺寸只要不超過父控制項允許的最大尺寸即可。因此,此時的mode是AT_MOST,size給出了父控制項允許的最大尺寸。
MeasureSpec.UNSPECIFIED是未指定尺寸,這種情況不多,一般都是父控制項是AdapterView,通過measure方法傳入的模式。
可以調用setMeasuredDimenson方法,將View的高度和寬度傳入,設置子View實際的大小,告訴父控制項需要多大的空間放置子View。
以下是框架中View的onMeasure的典型實現:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int measuredHeight = measureHeight(heightMeasureSpec);
int measuredWidth = measureWidth(widthMeasureSpec);
setMeasuredDimension(measuredHeight, measuredWidth);
private int measureHeight(int measureSpec) {
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
// Default size if no limits are specified.
int result = 500;
if (specMode == MeasureSpec.AT_MOST) {
// Calculate the ideal size of your
// control within this maximum size.
// If your control fills the available
// space return the outer bound.
result = specSize;
} else if (specMode == MeasureSpec.EXACTLY) {
// If your control can fit within these bounds return that
// value.
result = specSize;
return result;
private int measureWidth(int measureSpec) {
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
// Default size if no limits are specified.
int result = 500;
if (specMode == MeasureSpec.AT_MOST) {
// Calculate the ideal size of your control
// within this maximum size.
// If your control fills the available space
// return the outer bound.
result = specSize;
else if (specMode == MeasureSpec.EXACTLY) {
// If your control can fit within these bounds return that
// value.
result = specSize;
return result;
}

❼ 尋找一款可以在安卓手機里為照片標注尺寸的軟體

Pico軟體。

1、打開一張圖片,雙指放大圖片,可以更精確地對標注進行調整,旋轉角度、放大縮小。不滿意的話點擊右下角就能撤銷操作,或者選中標注,點擊刪除。

❽ 安卓 自定義控制項 什麼時候要用到onmeasure方法

Android中View的繪制過程
當Activity獲得焦點時,它將被要求繪制自己的布局,Android framework將會處理繪制過程,Activity只需提供它的布局的根節點。
繪制過程從布局的根節點開始,從根節點開始測量和繪制整個layout tree。
每一個ViewGroup 負責要求它的每一個孩子被繪制,每一個View負責繪制自己。
因為整個樹是按順序遍歷的,所以父節點會先被繪制,而兄弟節點會按照它們在樹中出現的順序被繪制。

繪制是一個兩遍(two pass)的過程:一個measure pass和一個layout pass。
測量過程(measuring pass)是在measure(int, int)中實現的,是從樹的頂端由上到下進行的。
在這個遞歸過程中,每一個View會把自己的dimension specifications傳遞下去。
在measure pass的最後,每一個View都存儲好了自己的measurements,即測量結果。

第二個是布局過程(layout pass),它發生在 layout(int, int, int, int)中,仍然是從上到下進行(top-down)。
在這一遍中,每一個parent都會負責用測量過程中得到的尺寸,把自己的所有孩子放在正確的地方。

閱讀全文

與安卓measure如何使用相關的資料

熱點內容
男主是只黑豹子叫夜 瀏覽:517
韓國愛情電影割眼鏡 瀏覽:712
微信伺服器怎麼連接到客戶端的 瀏覽:435
朴銀狐的電影有什麼 瀏覽:881
河北航天金稅盤伺服器地址雲主機 瀏覽:406
男人看日本片網址求一個 瀏覽:760
如何用boat玩伺服器 瀏覽:273
天堂txt 瀏覽:305
陳小春去台灣是哪一部 瀏覽:973
宅男免費影院 瀏覽:198
電影阿努可敦在線觀看 瀏覽:262
法國小女生電影推薦 瀏覽:606
畫江湖之不良人同人小說 瀏覽:75
北京少兒編程必修課 瀏覽:991
我愛你韓國百度雲 瀏覽:761
攻重生寵前世男妻 瀏覽:958
pdf電子簽名製作 瀏覽:881
她從對岸來完整版 瀏覽:737
韓國 保姆電影 瀏覽:770
女主叫簡寧小說名叫什麼 瀏覽:959