1

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

但是,文本的大小因屏幕而异。

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

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

4

4 回答 4

1

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


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

于 2013-02-07T14:50:50.763 回答
0

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

于 2013-02-28T10:11:57.127 回答
0

这是什么

getResources().getDisplayMetrics().density

确实是它使它在具有不同密度的相同屏幕尺寸上看起来相似。欣赏你的举动。

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

  1. 获取画布的屏幕百分比占用率(高度/宽度和画布的右/左/上/下百分比以在不同屏幕上均匀调整它们)。并将其应用为 layoutParams。
于 2013-02-07T14:53:04.687 回答
0

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

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

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

于 2016-02-11T20:38:34.680 回答