如何在 onLayout 期间调整 Android UI 元素的大小?
Posted
技术标签:
【中文标题】如何在 onLayout 期间调整 Android UI 元素的大小?【英文标题】:How can I resize an Android UI element during onLayout? 【发布时间】:2012-07-16 19:48:13 【问题描述】:我有一个基于LinearLayout
的按钮类,其中包含两个TextView
s,我希望按钮始终是方形的(我正在使用onMeasure()
),并且@987654324 的上部@s 自动调整大小以适应按钮。我希望较低的TextView
有固定大小的文本,所以它看起来大致像
|---------|
| |
| 1 8 0 |
| |
| foo |
|---------|
“180”在可用空间中尽可能大。
我正在调用onLayout()
中的一个名为adjustTextSize()
的函数:
private void adjustTextSize()
float height = mHeight - mTitleView.getMeasuredHeight() - 4 * mPadding - getPaddingTop() - getPaddingBottom(); //title text view
int numberheight = (int) (height * 0.75);
int extravertpadding = 0;//(int) (height * 0.125);
mTitleView.setPadding(mPadding, 0, mPadding, mPadding);
mNumberView.setTextSize(TypedValue.COMPLEX_UNIT_PX, numberheight);
mNumberView.setPadding(mPadding, mPadding + extravertpadding, mPadding, mPadding + extravertpadding);
if(mNumberView.getMeasuredWidth() > mWidth)
float reduction = mWidth / mNumberView.getMeasuredWidth();
extravertpadding = (int) ((numberheight - height*reduction) / 2);
numberheight = (int) (height*reduction);
mNumberView.setTextSize(TypedValue.COMPLEX_UNIT_PX, numberheight);
mNumberView.setPadding(mPadding, mPadding + extravertpadding, mPadding, mPadding + extravertpadding);
mNumberView.setTextSize(TypedValue.COMPLEX_UNIT_PX, numberheight);
mNumberView.setPadding(mPadding, mPadding + extravertpadding, mPadding, mPadding + extravertpadding);
mWidth
和 mHeight
在 onLayout()
中设置。
但是,我有两个初始问题:首先,将文本大小设置为某个像素值会使View
比像素值略大。我想计算出将文本高度设置为多大以适合可用空间;四分之三似乎可以,但我宁愿有一个确切的值。
第二个问题是getMeasuredWidth()
的值在我更改了文本大小后似乎没有改变。为什么不呢?
【问题讨论】:
【参考方案1】:第 2 部分的答案:
需要调用
mNumberView.measure(
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
);
告诉系统测量视图,就好像它的大小没有限制一样。调用此函数后,您可以了解如果空间没有对象,视图 会有多大,并相应地缩小它。
【讨论】:
以上是关于如何在 onLayout 期间调整 Android UI 元素的大小?的主要内容,如果未能解决你的问题,请参考以下文章
[Android Pro] Android开发实践:自定义ViewGroup的onLayout()分析