Android canvas 没有在我的位图上绘制文本
Android canvas doesn't draw the text on my bitmap
我正在尝试从用户那里获取文本输入并使用 Canvas
将其绘制在图像上,但是保存的图像没有应该绘制的内容。现在,在我担心字体、颜色、样式等之前,我只是想在图像上获取文本
这是我的代码:
public void createBitmapAndSave(ImageView img){
BitmapDrawable bitmapDrawable = ((BitmapDrawable) img.getDrawable());
Bitmap bitmap = bitmapDrawable.getBitmap();
Bitmap mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas(mutableBitmap);
Paint paint = new Paint();
paint.setColor(Color.BLUE);
paint.setTextSize(200);
paint.setStyle(Paint.Style.FILL);
paint.setShadowLayer(10f, 10f, 10f, Color.BLACK);
String topText = topTextView.getText().toString();
String bottomText = bottomTextView.getText().toString();
canvas.drawText(topText, 0, 0, paint);
canvas.drawText(bottomText, 50, 50, paint);
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);
bitmap.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++;
}
目前,基于我在其他 SO 帖子中看到的示例,我只有 2 个 .drawText()
实现。我的假设是文本不可见并且没有对图像进行任何更改,因为我没有为 paint
对象提供任何属性。
您看不到任何更改的主要问题是您对 mutableBitmap
进行了更改,但将原始 bitmap
保存到磁盘。
这可以通过将前两个(甚至三个)语句连接在一起来避免:
final Bitmap bitmap = bitmapDrawable.getBitmap()
.copy(Bitmap.Config.ARGB_8888, true);
您在其他任何地方都不需要原始位图,这有效地防止了您犯错误。不要做你不需要做的事。
一些提示:
- 绘图时始终明确。指定颜色,指定字体。您不能相信默认值。 (至少我永远不确定这些值。默认颜色是黑色还是透明?)
- 如果您想绝对确定字体,bundle it with your app or use downloadable fonts。某些平台允许用户将默认字体更改为疯狂的东西。
- 如果您想绘制多行文本,请查看
StaticLayout
.
- 确保您的应用可以在 Android 7 及更高版本上运行。 Sending intents with file Uri outside your app is prohibited.
我正在尝试从用户那里获取文本输入并使用 Canvas
将其绘制在图像上,但是保存的图像没有应该绘制的内容。现在,在我担心字体、颜色、样式等之前,我只是想在图像上获取文本
这是我的代码:
public void createBitmapAndSave(ImageView img){
BitmapDrawable bitmapDrawable = ((BitmapDrawable) img.getDrawable());
Bitmap bitmap = bitmapDrawable.getBitmap();
Bitmap mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas(mutableBitmap);
Paint paint = new Paint();
paint.setColor(Color.BLUE);
paint.setTextSize(200);
paint.setStyle(Paint.Style.FILL);
paint.setShadowLayer(10f, 10f, 10f, Color.BLACK);
String topText = topTextView.getText().toString();
String bottomText = bottomTextView.getText().toString();
canvas.drawText(topText, 0, 0, paint);
canvas.drawText(bottomText, 50, 50, paint);
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);
bitmap.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++;
}
目前,基于我在其他 SO 帖子中看到的示例,我只有 2 个 .drawText()
实现。我的假设是文本不可见并且没有对图像进行任何更改,因为我没有为 paint
对象提供任何属性。
您看不到任何更改的主要问题是您对 mutableBitmap
进行了更改,但将原始 bitmap
保存到磁盘。
这可以通过将前两个(甚至三个)语句连接在一起来避免:
final Bitmap bitmap = bitmapDrawable.getBitmap()
.copy(Bitmap.Config.ARGB_8888, true);
您在其他任何地方都不需要原始位图,这有效地防止了您犯错误。不要做你不需要做的事。
一些提示:
- 绘图时始终明确。指定颜色,指定字体。您不能相信默认值。 (至少我永远不确定这些值。默认颜色是黑色还是透明?)
- 如果您想绝对确定字体,bundle it with your app or use downloadable fonts。某些平台允许用户将默认字体更改为疯狂的东西。
- 如果您想绘制多行文本,请查看
StaticLayout
. - 确保您的应用可以在 Android 7 及更高版本上运行。 Sending intents with file Uri outside your app is prohibited.