动态按钮文字大小

时间:2012-12-14 18:50:21

标签: android

我想知道如何使按钮文字大小填充按钮的高度。当使用sp或dp大小的文本时,它适用于小屏幕分辨率(例如4“屏幕),但在平板电脑屏幕(10”)上按钮大小更大,按钮文本看起来非常小)我该如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

你可以重载Button的子节点中的onDraw()方法。这个example显示了如何使用android Paint类中的getTextBounds()来确定绘制时的文本大小。使用此信息,您可以计算textSize和textScaleX,以用于获取所需大小的文本。

目标是找到textSizetextScaleX的值,这些值会调整文字大小以填充我们的视图。我们不会在每次调用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,我们使用Paint对象的getTextBounds()方法来确定已知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值。我们找到textScaleX为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);
}

答案 1 :(得分:1)

您可以尝试相对于按钮高度设置按钮文字大小。

例如:在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);  
  }

答案 2 :(得分:0)

使用layout_height中的wrap_content来比较sp和dp

答案 3 :(得分:0)

我明白了!

我创建了文件夹: 值-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,而不是使用单位(10sp,10px,10dp)的按钮文本大小。