我一直在寻找如何解决问题的日子,而且我们找不到答案。如果已经有类似的问题,我提前道歉。
我的问题很简单。我希望用户输入一个名字,这个名字将写在一个图像上,在某种小盒子里。 (无论如何,图像在意图和所有内容中共享......)
图片是我的drawable文件夹中的png。因此,在任何类型的设备上,它应始终具有相同的像素大小。
我在一个位图上加载png,在该位图上使用canvas,创建一个paint并myPaint.setTextSize(100)
(setTextSize占用像素,所以在这种情况下它是100像素),然后使用该paint在画布上使用drawText来生成相同的文本使用任何设备的大小(以像素为单位)。
结果是写了#My; MeName"在一台设备上非常适合,但在较小的设备上,它可以开箱即用,也可以放在更大的设备上。
我尝试使用dp或sp,即使我知道它不会改变任何东西,因为我们不是在讨论布局,而是一个具有固定大小的可绘制png。&#39; < / p>
我对文本的位置或任何事情没有任何问题;只有它的大小。
所以无论如何,我不知道从一个设备到另一个设备的文本化变化来自哪里。也许我没有处理某种细节。我希望你们能帮助我。
Context context = getBaseContext();
Resources resources = context.getResources();
Bitmap card = BitmapFactory.decodeResource(resources, R.drawable.card);
android.graphics.Bitmap.Config bitmapConfig = card.getConfig();
if(bitmapConfig == null) {
bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888;
}
// Converting to mutable
card = card.copy(bitmapConfig, true);
Canvas canvas = new Canvas(card);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
// text color
paint.setColor(Color.WHITE);
paint.setFakeBoldText(true);
paint.setTextAlign(Paint.Align.CENTER);
// text size in pixels
paint.setTextSize(100);
// Name Position
float xName = (float) (0.744 * card.getWidth() );
float yName = (float) (0.680424 * (card.getHeight() - (paint.ascent()/2)));
String name = editName.getText().toString();
canvas.drawText(name, xName, yName, paint);
答案 0 :(得分:0)
试试这个。
/**
* Sets the text size for a Paint object so a given string of text will be a
* given width.
*
* @param paint
* the Paint to set the text size for
* @param desiredWidth
* the desired width
* @param text
* the text that should be that width
*/
private static void setTextSizeForWidth(Paint paint, float desiredWidth,
String text) {
// Pick a reasonably large value for the test. Larger values produce
// more accurate results, but may cause problems with hardware
// acceleration. But there are workarounds for that, too; refer to
// http://stackoverflow.com/questions/6253528/font-size-too-large-to-fit-in-cache
final float testTextSize = 48f;
// Get the bounds of the text, using our testTextSize.
paint.setTextSize(testTextSize);
Rect bounds = new Rect();
paint.getTextBounds(text, 0, text.length(), bounds);
// Calculate the desired size as a proportion of our testTextSize.
float desiredTextSize = testTextSize * desiredWidth / bounds.width();
// Set the paint for that size.
paint.setTextSize(desiredTextSize);
}
答案 1 :(得分:0)
我能够通过使用密度来解决这个问题。不确定它是如何工作的,但它完成了工作......
<!DOCTYPE html>
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/raphael/2.2.7/raphael.min.js">
</script>
<script src="https://cdn.jsdelivr.net/wheelnav/1.7.0/wheelnav.min.js" type="text/javascript">
</script>
<title></title>
</head>
<body>
<div id="wheelDiv"></div>
<script>
wheel = new wheelnav('wheelDiv');
wheel.clockwise = false;
wheel.createWheel(['title-0', 'title-1', 'title-2', 'title-3', 'title-4']);
</script>
</body>
</html>