android設置寬高
Ⅰ Android 自定義View:為什麼你設置的wrap_content不起作用
在使用自定義View時,View寬 / 高的 wrap_content 屬性不起自身應有的作用,而且是起到與 match_parent 相同作用。
其實這里有兩個問題:
請分析 & 解決問題之前,請先看自定義View原理中 (2)自定義View Measure過程 - 最易懂的自定義View原理系列
問題出現在View的寬 / 高設置,那我們直接來看自定義View繪制中第一步對View寬 / 高設置的過程:measure過程中的 onMeasure() 方法
繼續往下看 getDefaultSize()
從上面發現:
那麼有人會問:wrap_content和match_parent具有相同的效果,為什麼是填充父容器的效果呢?
我們知道,子View的MeasureSpec值是根據子View的布局參數(LayoutParams)和父容器的MeasureSpec值計算得來,具體計算邏輯封裝在getChildMeasureSpec()里。
接下來,我們看生成子View MeasureSpec的方法: getChildMeasureSpec() 的源碼分析:
getChildMeasureSpec()
從上面可以看出,當子View的布局參數使用 match_parent 或 wrap_content 時:
所以: wrap_content 起到了和 match_parent 相同的作用:等於父容器當前剩餘空間大小
當自定義View的布局參數設置成wrap_content時時,指定一個默認大小(寬 / 高)。
這樣,當你的自定義View的寬 / 高設置成wrap_content屬性時就會生效了。
網上流傳著這么一個解決方案:
答: 是,當父View為 AT_MOST 、View為 match_parent 時,該View的 match_parent 的效果就等於 wrap_content 。上述方法存在邏輯錯誤,但由於這種情況非常特殊的,所以導致最終的結果沒有錯誤。具體分析請看下面例子:
從上面的效果可以看出,View大小 = 默認值
我再將子View的屬性改為 wrap_content :
從上面的效果可以看出,View大小還是等於默認值。
相信看到這里你已經看懂了:
為了更好的表示判斷邏輯,我建議你們用本文提供的解決方案,即根據布局參數判斷默認值的設置
不定期分享關於 安卓開發 的干貨,追求 短、平、快 ,但 卻不缺深度 。
Ⅱ Android中測量控制項的內部文字內容的寬、高度
在Android中,自定義View時通過Canvas繪制文字時,測量控制項內部文字內容的寬、高是關鍵步驟。本文將介紹幾種常用方法,旨在幫助開發者解決這一問題。
首先,可通過`Paint.measureText`方法測量文本的寬度。這是一個快捷方式,適用於快速獲取文本寬度信息。
其次,使用`Paint.getTextBounds`方法,可以獲得文字所在矩形區域,進而得到寬度和高度。該方法更為全面,適用於需要精確測量場景。
`Paint.getTextWidths`方法同樣提供每個字元的寬度信息,對於處理多字元文本布局問題非常有用。
通過`Paint.FontMetrics`或`Paint.FontMetricsInt`可以獲取高度。兩者主要區別在於精度,前者為float,後者為int,具體使用時需根據需求選擇。
獲取高度時,注意到兩個高度值略有不同,`height2`值略大於`height1`,以保證文本頂部和底部有足夠的留白。在實際應用中,需根據具體需求選擇合適的高度值。
此外,通過`Paint.getFontSpacing`和`Paint.getFontMetrics(null)`方法獲取高度,本質上是調用`Paint.getFontMetrics`實現的。獲取的高度值與`fontMetrics.descent - fontMetrics.ascent`計算結果一致。
`Layout.getDesiredWidth`方法用於獲取寬度信息,但在TextView布局中可能存在文字實際佔用高度與屬性`textSize`值不一致的問題。文檔中提示可通過設置`android:includeFontPadding`來控制是否包含上下空白。
總結而言,Android中測量文字內容寬、高有多種方法,開發者需根據具體需求選擇合適的方法。理解不同方法的特性和應用場景,有助於更精確地控制文字布局,提升應用界面的美觀性和用戶體驗。
Ⅲ android 開發的時候怎麼動態設置控制項寬高
1、獲取控制項所在的布局
java">LayoutParamspara=button.getLayoutParams();//獲取按鈕的布局
2、修改布局中的height,width屬性
para.width=200;//修改寬度
para.height=300;//修改高度
3、重新設置修改後的布局給控制項
button.setLayoutParams(para);//設置修改後的布局。