如何在 Kotlin 中从 text/string 创建可绘制的图标?
How to create an icon drawable from a text/string in Kotlin?
是否可以在 Android(使用 Kotlin)中有问题地将文本“绘制”到 Shape 或 Drawable 以将结果用作 image ImageView
?
在 iOS 中,将自定义文本绘制到 UIImageContext
是没有问题的,然后可以用来创建 UIImage
()。 Android 也有类似的东西吗?
您可以制作自己的 Drawable 实现。 Android 绘图是通过 Paint 和 Canvas 完成的。这是一个例子:
class TextIconDrawable: Drawable() {
private var alpha = 255
private var textPaint = TextPaint().apply {
textAlign = Paint.Align.CENTER
}
var text by Delegates.observable("") { _, _, _ -> invalidateSelf() }
var textColor by Delegates.observable(Color.BLACK) { _, _, _ -> invalidateSelf() }
private fun fitText(width: Int) {
textPaint.textSize = 48f
val widthAt48 = textPaint.measureText(text)
textPaint.textSize = 48f / widthAt48 * width.toFloat()
}
override fun draw(canvas: Canvas) {
val width = bounds.width()
val height = bounds.height()
fitText(width)
textPaint.color = ColorUtils.setAlphaComponent(textColor, alpha)
canvas.drawText(text, width / 2f, height / 2f, textPaint)
}
override fun setAlpha(alpha: Int) {
this.alpha = alpha
}
override fun setColorFilter(colorFilter: ColorFilter?) {
textPaint.colorFilter = colorFilter
}
override fun getOpacity(): Int = PixelFormat.TRANSLUCENT
}
用法:
val drawable = TextIconDrawable().apply {
text = "Hello, world!"
textColor = Color.BLACK
}
requireView().findViewById<ImageView>(R.id.imageView).setImageDrawable(drawable)
您当然可以自定义公开哪些属性。或者,如果这是一次性使用的东西,只需在绘画实例上根据需要设置属性即可。
是否可以在 Android(使用 Kotlin)中有问题地将文本“绘制”到 Shape 或 Drawable 以将结果用作 image ImageView
?
在 iOS 中,将自定义文本绘制到 UIImageContext
是没有问题的,然后可以用来创建 UIImage
(
您可以制作自己的 Drawable 实现。 Android 绘图是通过 Paint 和 Canvas 完成的。这是一个例子:
class TextIconDrawable: Drawable() {
private var alpha = 255
private var textPaint = TextPaint().apply {
textAlign = Paint.Align.CENTER
}
var text by Delegates.observable("") { _, _, _ -> invalidateSelf() }
var textColor by Delegates.observable(Color.BLACK) { _, _, _ -> invalidateSelf() }
private fun fitText(width: Int) {
textPaint.textSize = 48f
val widthAt48 = textPaint.measureText(text)
textPaint.textSize = 48f / widthAt48 * width.toFloat()
}
override fun draw(canvas: Canvas) {
val width = bounds.width()
val height = bounds.height()
fitText(width)
textPaint.color = ColorUtils.setAlphaComponent(textColor, alpha)
canvas.drawText(text, width / 2f, height / 2f, textPaint)
}
override fun setAlpha(alpha: Int) {
this.alpha = alpha
}
override fun setColorFilter(colorFilter: ColorFilter?) {
textPaint.colorFilter = colorFilter
}
override fun getOpacity(): Int = PixelFormat.TRANSLUCENT
}
用法:
val drawable = TextIconDrawable().apply {
text = "Hello, world!"
textColor = Color.BLACK
}
requireView().findViewById<ImageView>(R.id.imageView).setImageDrawable(drawable)
您当然可以自定义公开哪些属性。或者,如果这是一次性使用的东西,只需在绘画实例上根据需要设置属性即可。