一、需求描述
项目有个需求需要在全屏图片上展示文字并生成一个新的图片并分享出去,图片全屏,文字居中。
于是便想到了使用Canvas来直接进行绘制。
二、实现代码
private fun createImg(imageView: ImageView, textView: TextView): Bitmap {
//返回具有指定宽度和高度的可变位图
val imageViewBitmap =
Bitmap.createBitmap(imageView.width, imageView.height, Bitmap.Config.ARGB_8888)
//使用指定的位图构造一个画布以绘制到其中。位图必须是可变的。
val imageViewCanvas = Canvas(imageViewBitmap)
//手动将此视图(及其所有子视图)渲染到给定的Canvas。
imageView.draw(imageViewCanvas)
val textViewText = textView.text.toString()
val textViewTextSize = textView.textSize
val textViewTextColor = textView.currentTextColor
val combinedBitmap =
Bitmap.createBitmap(imageView.width, imageView.height, Bitmap.Config.ARGB_8888)
val combinedCanvas = Canvas(combinedBitmap)
//绘制指定的位图,其上角/左角位于(x,y),并由当前矩阵变换。
combinedCanvas.drawBitmap(imageViewBitmap, 0f, 0f, null)
val textPaint = TextPaint()
textPaint.textSize = textViewTextSize
textPaint.color = textViewTextColor
val maxWidth = 300f * textView.context.resources.displayMetrics.density
val textLayout = StaticLayout(
textViewText,
textPaint,
maxWidth.toInt(),
Layout.Alignment.ALIGN_CENTER,
1.0f,
0.0f,
false
)
//文案居中
val textY = (imageView.height - textLayout.height) / 2
combinedCanvas.save()
combinedCanvas.translate((imageView.width - maxWidth) / 2, textY.toFloat())
//文本绘制到画布中去
textLayout.draw(combinedCanvas)
combinedCanvas.restore()
return combinedBitmap
}
具体原理在代码中注释了。
2023.11.06
发现其实没必要,只要把父布局生成一张图片就行了,上面的方法,反而花的时间反而很多,性能不友好。
val width = mBinding.allContentCL.width
val height = mBinding.allContentCL.height
val bitmap: Bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
mBinding.allContentCL.draw(canvas)
这样就行了。这个bitmap对象就是这个控件生成的图片