所有屏幕中的Java Android Canvas.drawText(...)都同样大

时间:2013-02-07 14:46:01

标签: java android android-canvas text-size

我在项目中使用canvas.drawText(...)绘制了文本,并使用不同的设备对其进行了测试。

然而,文本的大小在屏幕之间变化很大。

我试图将它与getResources().getDisplayMetrics().density相乘,但它们的大小仍然略有不同。

有没有办法让文本在不同的设备上具有相同的大小?

4 个答案:

答案 0 :(得分:1)

嗨,你可以看一下这篇文章,http://catchthecows.com/?p=72,我觉得它对你有帮助。     @覆盖     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();
}


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);
}


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);
}

@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);
}

https://github.com/catchthecows/BigTextButton

答案 1 :(得分:0)

这是什么

getResources()。getDisplayMetrics()。密度

确实是它在不同密度的相同屏幕尺寸上看起来相似。感谢你的举动。

您的问题有两个解决方案。 1.尝试使用Large,xlarge和normal layout。在相应的布局上相应地调整它们以使其看起来均匀。

  1. 获取画布的屏幕百分比占用率(画布的高度/宽度和右/左/上/下)百分比以在不同屏幕上均匀调整它们。并将其应用为layoutParams。

答案 2 :(得分:0)

Paint类采用文本大小(以像素为单位)。如果您要直接通过它绘制文本,则需要在调用paint.setTextSize(float size)之前处理单位转换。始终使用sp或dp单位,您可能希望至少包含用于小型,普通,大型和xlarge屏幕的单独的dimens.xml资源。

答案 3 :(得分:0)

调用Canvas.drawText()时,文本大小首先由传入的Paint对象确定,该对象可以通过Paint.setTextSize()设置。文本大小由Canvas根据画布密度自动缩放,可以使用Canvas.getDensity()找到。

在将在Canvas上绘制的绘画对象上设置文本大小时,使用单位值dpsp并让Canvas为您处理缩放。

当然,您可能需要根据屏幕尺寸指定不同的值:Supporting Multiple Screens