我想知道如何使按钮文本大小填充按钮的高度。当使用 sp 或 dp 大小的文本时,它适用于小屏幕分辨率(例如 4 英寸屏幕),但在平板电脑屏幕(10 英寸)上,按钮尺寸更大,按钮文本看起来很小)我该如何解决这个问题?
4 回答
您可以尝试设置相对于按钮高度的按钮文本大小。
例如:在 XML 中使用按钮的权重来填充整个屏幕(不管屏幕大小):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<Button
android:id="@+id/button1"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<Button
android:id="@+id/button2"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
在通过覆盖 onwindowfocuschanged 绘制布局后,您可以设置按钮文本的高度(例如按钮高度的 1/3):
@Override
public void onWindowFocusChanged (boolean hasFocus) { // the layout is set
button1 = (Button)findViewById(R.id.button1);
int text_height = button1.getHeight()/3; // define text_height as 1/3 of button height in px
button1.setTextSize(TypedValue.COMPLEX_UNIT_PX, text_height); // set text height in px
button2 = (Button)findViewById(R.id.button2);
int text_height = button2.getHeight()/3;
button2.setTextSize(TypedValue.COMPLEX_UNIT_PX, text_height);
}
您可以onDraw()
在 Button 的子项中重载该方法。此示例显示如何使用getTextBounds()
android Paint 类来确定绘制时文本的大小。使用此信息,您可以计算 textSize 和 textScaleX 以用于使您的文本达到您想要的大小。
目标是找到 和 的值,textSize
这textScaleX
将调整我们的文本大小以填充我们的视图。我们不会在每次调用 onDraw 时都计算这个值,而是观察大小变化并预先计算值。为此,我们重写 onSizeChanged 以获取新的视图宽度和高度。
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
// save view size
mViewWidth = w;
mViewHeight = h;
// first determine font point size
adjustTextSize();
// then determine width scaling
// this is done in two steps in case the
// point size change affects the width boundary
adjustTextScale();
}
从onSizeChanged
你必须调用两种方法。第一个确定 textSize 我们使用getTextBounds()
Paint 对象的方法来确定已知 textSize 的文本大小。从那里我们做一个简单的计算来确定使用什么 textSize 来产生我们想要的文本边界。
void adjustTextSize() {
mTextPaint.setTextSize(100);
mTextPaint.setTextScaleX(1.0f);
Rect bounds = new Rect();
// ask the paint for the bounding rect if it were to draw this
// text
mTextPaint.getTextBounds(mText, 0, mText.length(), bounds);
// get the height that would have been produced
int h = bounds.bottom - bounds.top;
// make the text text up 70% of the height
float target = (float)mViewHeight*.7f;
// figure out what textSize setting would create that height
// of text
float size = ((target/h)*100f);
// and set it into the paint
mTextPaint.setTextSize(size);
}
第二种方法以相同的方式确定 textScaleX 值。我们找到 atextScaleX
为 1.0 时的大小,然后做一些简单的数学运算来确定什么比例会导致我们想要的边界宽度。这是在文本大小计算的单独调用中完成的,以防万一设置 textSize 影响缩放结果。改变textScaleX
绝对不会改变绘制文本的高度。
void adjustTextScale() {
// do calculation with scale of 1.0 (no scale)
mTextPaint.setTextScaleX(1.0f);
Rect bounds = new Rect();
// ask the paint for the bounding rect if it were to draw this
// text.
mTextPaint.getTextBounds(mText, 0, mText.length(), bounds);
// determine the width
int w = bounds.right - bounds.left;
// calculate the baseline to use so that the
// entire text is visible including the descenders
int text_h = bounds.bottom-bounds.top;
mTextBaseline=bounds.bottom+((mViewHeight-text_h)/2);
// determine how much to scale the width to fit the view
float xscale = ((float) (mViewWidth-getPaddingLeft()-getPaddingRight())) / w;
// set the scale for the text paint
mTextPaint.setTextScaleX(xscale);
}
最后一个细节是确定在视图中垂直绘制文本的位置。getTextBounds 返回的边界矩形可以帮助解决这个问题。bounds.top 值实际上是一个负值,它表示文本的大小,不包括任何下降部(延伸到基线以下的字母部分)的大小。bounds.bottom 值是下降器的大小。使用这些信息,我们可以决定如何在视图中定位文本。调用 drawText 中的 y 值表示基线。下降线将绘制在这条线的下方。对于这个例子,我们调整 y 值,以便我们显示完整的下降。此值保存为mTextBaseline
并在 onDraw 中使用。
@Override
protected void onDraw(Canvas canvas) {
// let the ImageButton paint background as normal
super.onDraw(canvas);
// draw the text
// position is centered on width
// and the baseline is calculated to be positioned from the
// view bottom
canvas.drawText(mText, mViewWidth/2, mViewHeight-mTextBaseline, mTextPaint);
}
使用 layout_height 中的 wrap_content 来比较 sp 和 dp
我想通了!
我创建了文件夹:values-ldpi
值-小
正常值
值-大
值-xlarge
在每个文件夹中,我创建了 dimens.xml 文件。
例如 values-small 中的 dimens.xml 文件如下所示:
<resources>
<dimen name="text_button">10sp</dimen>
</resources>
值正常中的 dimens.xml 文件,如下所示:
<resources>
<dimen name="text_button">12sp</dimen>
</resources>
然后,您只需将其指向 text_button,而不是使用带有 unit(10sp,10px,10dp) 的按钮文本大小。