如何在 Canvas 上水平居中文本
How to center text horizontally on Canvas
我有一个带有 2 个 TextView 的 ImageView。我正在尝试将字幕的中位数与 Canvas
的中位数 (width/2) 对齐。这是我要实现的目标的说明:
到目前为止,我尝试将 TextView 从其左端与 Canvas 的垂直中心对齐。
public void createBitmapAndSave(ImageView img) {
BitmapDrawable bitmapDrawable = ((BitmapDrawable) img.getDrawable());
Bitmap bitmap = bitmapDrawable.getBitmap();
Bitmap mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
String topText = topTextView.getText().toString();
String bottomText = bottomTextView.getText().toString();
Canvas canvas = new Canvas(mutableBitmap);
Paint topPaint = new Paint();
Paint bottomPaint = new Paint();
topPaint.setColor(Color.BLUE);
topPaint.setStyle(Paint.Style.FILL);
topPaint.setShadowLayer(10f, 10f, 10f, Color.BLACK);
topPaint.setTextSize(topTextView.getTextSize());
bottomPaint.setColor(Color.RED);
bottomPaint.setStyle(Paint.Style.FILL);
bottomPaint.setShadowLayer(10f, 10f, 10f, Color.BLACK);
bottomPaint.setTextSize(bottomTextView.getTextSize());
canvas.drawText(topText, (canvas.getWidth()) / 2, 200, topPaint);
canvas.drawText(bottomText, (canvas.getWidth()) / 2, canvas.getHeight() - 200, bottomPaint);
File file;
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath();
file = new File(path + "/SimpliMeme/" + timeStamp + "-" + counter + ".jpg");
file.getParentFile().mkdir();
try {
OutputStream stream = new FileOutputStream(file);
mutableBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
stream.flush();
stream.close();
Toast.makeText(getContext(), "Meme Saved", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
Uri contentUri = Uri.fromFile(file);
mediaScanIntent.setData(contentUri);
Objects.requireNonNull(getContext()).sendBroadcast(mediaScanIntent);
counter++;
}
其实很简单。您需要做的就是使用 Paint.measureText()
方法获取文本的宽度,除以 2 得到其一半,然后将其向左移动以使其居中。
看看这个。我创建了两个 float
变量来保存 Canvas:
上每个文本的宽度
float topTextMeasurement = topPaint.measureText(topText);
float bottomTextMeasurement = bottomPaint.measureText(bottomText);
然后我在你的 Canvas.drawText()
方法的 x 参数中完成了上述调整。
canvas.drawText(topText, topX - (topTextMeasurement/2), 200, topPaint);
canvas.drawText(bottomText, bottomX - (bottomTextMeasurement/2), canvas.getHeight() - 200, bottomPaint);
但这只是在您的文本不超过一行的情况下。对于多行文本,我建议您查看 DynamicLayout
我有一个带有 2 个 TextView 的 ImageView。我正在尝试将字幕的中位数与 Canvas
的中位数 (width/2) 对齐。这是我要实现的目标的说明:
到目前为止,我尝试将 TextView 从其左端与 Canvas 的垂直中心对齐。
public void createBitmapAndSave(ImageView img) {
BitmapDrawable bitmapDrawable = ((BitmapDrawable) img.getDrawable());
Bitmap bitmap = bitmapDrawable.getBitmap();
Bitmap mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
String topText = topTextView.getText().toString();
String bottomText = bottomTextView.getText().toString();
Canvas canvas = new Canvas(mutableBitmap);
Paint topPaint = new Paint();
Paint bottomPaint = new Paint();
topPaint.setColor(Color.BLUE);
topPaint.setStyle(Paint.Style.FILL);
topPaint.setShadowLayer(10f, 10f, 10f, Color.BLACK);
topPaint.setTextSize(topTextView.getTextSize());
bottomPaint.setColor(Color.RED);
bottomPaint.setStyle(Paint.Style.FILL);
bottomPaint.setShadowLayer(10f, 10f, 10f, Color.BLACK);
bottomPaint.setTextSize(bottomTextView.getTextSize());
canvas.drawText(topText, (canvas.getWidth()) / 2, 200, topPaint);
canvas.drawText(bottomText, (canvas.getWidth()) / 2, canvas.getHeight() - 200, bottomPaint);
File file;
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath();
file = new File(path + "/SimpliMeme/" + timeStamp + "-" + counter + ".jpg");
file.getParentFile().mkdir();
try {
OutputStream stream = new FileOutputStream(file);
mutableBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
stream.flush();
stream.close();
Toast.makeText(getContext(), "Meme Saved", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
Uri contentUri = Uri.fromFile(file);
mediaScanIntent.setData(contentUri);
Objects.requireNonNull(getContext()).sendBroadcast(mediaScanIntent);
counter++;
}
其实很简单。您需要做的就是使用 Paint.measureText()
方法获取文本的宽度,除以 2 得到其一半,然后将其向左移动以使其居中。
看看这个。我创建了两个 float
变量来保存 Canvas:
float topTextMeasurement = topPaint.measureText(topText);
float bottomTextMeasurement = bottomPaint.measureText(bottomText);
然后我在你的 Canvas.drawText()
方法的 x 参数中完成了上述调整。
canvas.drawText(topText, topX - (topTextMeasurement/2), 200, topPaint);
canvas.drawText(bottomText, bottomX - (bottomTextMeasurement/2), canvas.getHeight() - 200, bottomPaint);
但这只是在您的文本不超过一行的情况下。对于多行文本,我建议您查看 DynamicLayout