一、需求描述
项目有个需求需要在全屏图片上展示文字并生成一个新的图片并分享出去,图片全屏,文字居中。
于是便想到了使用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.textSizeval textViewTextColor = textView.currentTextColorval 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 = textViewTextSizetextPaint.color = textViewTextColorval maxWidth = 300f * textView.context.resources.displayMetrics.densityval textLayout = StaticLayout(textViewText,textPaint,maxWidth.toInt(),Layout.Alignment.ALIGN_CENTER,1.0f,0.0f,false)//文案居中val textY = (imageView.height - textLayout.height) / 2combinedCanvas.save()combinedCanvas.translate((imageView.width - maxWidth) / 2, textY.toFloat())//文本绘制到画布中去textLayout.draw(combinedCanvas)combinedCanvas.restore()return combinedBitmap}
具体原理在代码中注释了。