如何在 Canvas 上绘制全部大写的文本
How to draw text in all caps on Canvas
我正在使用 TextPaint
和 StaticLayout
在 Canvas
上绘制文本。但是,我希望我的文字以大写字母绘制。网上的建议是使用 toUpperCase()
但这种变化并没有反映在 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);
TextPaint topPaint = new TextPaint();
TextPaint bottomPaint = new TextPaint();
Typeface typeface = getResources().getFont(R.font.impact);
topPaint.setColor(Color.WHITE);
topPaint.setStyle(Paint.Style.FILL);
topPaint.setTextSize(topTextView.getTextSize());
topPaint.setTypeface(typeface);
bottomPaint.setColor(Color.WHITE);
bottomPaint.setStyle(Paint.Style.FILL);
bottomPaint.setTextSize(bottomTextView.getTextSize());
bottomPaint.setTypeface(typeface);
float topTextMeasurement = topPaint.measureText(topText);
float bottomTextMeasurement = bottomPaint.measureText(bottomText);
StaticLayout topLayout = new StaticLayout(topText, topPaint, canvas.getWidth(), Layout.Alignment.ALIGN_CENTER, 1.0f,
0.0f, false);
StaticLayout bottomLayout = new StaticLayout(bottomText, bottomPaint, canvas.getWidth(), Layout.Alignment.ALIGN_CENTER,
1.0f, 0.0f, false);
topText.toUpperCase();
bottomText.toUpperCase();
canvas.translate(0,0);
topLayout.draw(canvas);
canvas.translate(0, canvas.getHeight() - 210);
bottomLayout.draw(canvas);
counter++;
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(), "Top Text: " + String.valueOf(topTextMeasurement) + " and bottom text: " + String.valueOf(bottomTextMeasurement),
Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
Uri contentUri = Uri.fromFile(file);
mediaScanIntent.setData(contentUri);
Objects.requireNonNull(getContext()).sendBroadcast(mediaScanIntent);
}
toUpperCase()
不会修改原始字符串,它会创建 returns 新字符串。您忽略了 toUpperCase()
的结果,这就是它对您不起作用的原因。
将 topText.toUpperCase();
替换为 topText = topText.toUpperCase();
。 bottomText
相同
我正在使用 TextPaint
和 StaticLayout
在 Canvas
上绘制文本。但是,我希望我的文字以大写字母绘制。网上的建议是使用 toUpperCase()
但这种变化并没有反映在 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);
TextPaint topPaint = new TextPaint();
TextPaint bottomPaint = new TextPaint();
Typeface typeface = getResources().getFont(R.font.impact);
topPaint.setColor(Color.WHITE);
topPaint.setStyle(Paint.Style.FILL);
topPaint.setTextSize(topTextView.getTextSize());
topPaint.setTypeface(typeface);
bottomPaint.setColor(Color.WHITE);
bottomPaint.setStyle(Paint.Style.FILL);
bottomPaint.setTextSize(bottomTextView.getTextSize());
bottomPaint.setTypeface(typeface);
float topTextMeasurement = topPaint.measureText(topText);
float bottomTextMeasurement = bottomPaint.measureText(bottomText);
StaticLayout topLayout = new StaticLayout(topText, topPaint, canvas.getWidth(), Layout.Alignment.ALIGN_CENTER, 1.0f,
0.0f, false);
StaticLayout bottomLayout = new StaticLayout(bottomText, bottomPaint, canvas.getWidth(), Layout.Alignment.ALIGN_CENTER,
1.0f, 0.0f, false);
topText.toUpperCase();
bottomText.toUpperCase();
canvas.translate(0,0);
topLayout.draw(canvas);
canvas.translate(0, canvas.getHeight() - 210);
bottomLayout.draw(canvas);
counter++;
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(), "Top Text: " + String.valueOf(topTextMeasurement) + " and bottom text: " + String.valueOf(bottomTextMeasurement),
Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
Uri contentUri = Uri.fromFile(file);
mediaScanIntent.setData(contentUri);
Objects.requireNonNull(getContext()).sendBroadcast(mediaScanIntent);
}
toUpperCase()
不会修改原始字符串,它会创建 returns 新字符串。您忽略了 toUpperCase()
的结果,这就是它对您不起作用的原因。
将 topText.toUpperCase();
替换为 topText = topText.toUpperCase();
。 bottomText