Android 图片和文本生成新的图片(Canvas)

文章讲述了如何在全屏图片上添加文字并生成新图片,最初通过Canvas实现但发现效率不高。作者后来提出更简洁的方法,直接获取父布局的截图,提高性能。
摘要由CSDN通过智能技术生成

一、需求描述

项目有个需求需要在全屏图片上展示文字并生成一个新的图片并分享出去,图片全屏,文字居中。

于是便想到了使用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对象就是这个控件生成的图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

&岁月不待人&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值