我在我的项目中绘制了文本canvas.drawText(...)
并使用不同的设备对其进行了测试。
但是,文本的大小因屏幕而异。
我试图将它与它相乘,getResources().getDisplayMetrics().density
但它们的大小仍然略有不同。
有没有办法让文本在不同的设备上具有相同的大小?
我在我的项目中绘制了文本canvas.drawText(...)
并使用不同的设备对其进行了测试。
但是,文本的大小因屏幕而异。
我试图将它与它相乘,getResources().getDisplayMetrics().density
但它们的大小仍然略有不同。
有没有办法让文本在不同的设备上具有相同的大小?
嗨,你可以看看这篇文章,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);
}
Paint 类采用以像素为单位的文本大小。如果你要直接通过它来绘制文本,那么你需要在调用paint.setTextSize(float size)之前处理单位转换。始终使用 sp 或 dp 单位,您可能希望至少为小屏幕、普通屏幕、大屏幕和超大屏幕包含单独的 dimens.xml 资源。
这是什么
getResources().getDisplayMetrics().density
确实是它使它在具有不同密度的相同屏幕尺寸上看起来相似。欣赏你的举动。
您的问题有两种解决方案。1. 尝试使用 Large、xlarge 和 normal 布局。在各自的布局上相应地调整它们以使其看起来均匀。
调用Canvas.drawText()
时文本大小首先由传入的Paint
对象确定,可以通过Paint.setTextSize()
. 文本大小会Canvas
根据画布密度自动缩放,可以使用Canvas.getDensity()
.
在将要在 Canvas 上绘制的绘制对象上设置文本大小时,使用单位值dp
orsp
并让 Canvas 为您处理缩放。
当然,您可能需要根据屏幕尺寸指定不同的值:Supporting Multiple Screens