问题描述
限时送ChatGPT账号..我有 BubbleTextView,它是一个自定义 TextView,后面有一个蓝色气泡作为背景.
I have BubbleTextView which is a custom TextView with a blue bubble behind as background.
这是我的代码:
class BubbleTextView(context: Context?, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : TextView(context, attrs, defStyleAttr, defStyleRes) {
private val paint = Paint(Paint.ANTI_ALIAS_FLAG)
private val rectPath = Path()
private val trianglePath = Path()
private val rectF = RectF()
private val triangleSize = resources.getDimensionPixelSize(R.dimen.triangle_size_20dp).toFloat()
private val cornerRadius = resources.getDimensionPixelSize(R.dimen.corner_radius_4dp).toFloat()
constructor(context: Context?):this(context, null, 0, 0)
constructor(context: Context?, attrs: AttributeSet?):this(context, attrs, 0, 0)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int):this(context, attrs, defStyleAttr, 0)
init{
paint.style = Paint.Style.FILL
paint.color = Color.CYAN
}
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
super.onLayout(changed, left, top, right, bottom)
val myWidth = (right - left).toFloat()
val myHeight = (bottom - top).toFloat()
val centerX = myWidth / 2f
val lowerEdgeY = myHeight * 0.8f
rectF.set(0f, 0f, myWidth, lowerEdgeY)
rectPath.addRoundRect(rectF,cornerRadius, cornerRadius, Path.Direction.CW )
val delta = triangleSize * 0.5f
trianglePath.moveTo(centerX - delta, lowerEdgeY)
trianglePath.lineTo(centerX + delta, lowerEdgeY)
trianglePath.lineTo(centerX, myHeight)
trianglePath.close()
}
override fun onDraw(canvas: Canvas?) {
canvas?.drawPath(rectPath, paint)
canvas?.drawPath(trianglePath, paint)
super.onDraw(canvas)
}
}
: TextView
以红色高亮显示错误:android.widget.TextView() 需要 api 21.
: TextView
is highlighted red with error: android.widget.TextView() requires api 21.
对于 api 21 及以上版本,apl 工作正常.但是对于下面的应用程序立即崩溃了.
For api 21 and above the apl is working fine. But for below the app crashed instantly.
提前致谢.
推荐答案
Constructorclass BubbleTextView(context: Context?, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : TextView(context, attrs, defStyleAttr, defStyleRes)
在 API 级别 21 中添加,因此您只能使用 >= 21
Constructor
class BubbleTextView(context: Context?, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : TextView(context, attrs, defStyleAttr, defStyleRes)
added in API level 21, so you only can use >= 21
你应该:
class BubbleTextView : TextView {
private val paint = Paint(Paint.ANTI_ALIAS_FLAG)
private val rectPath = Path()
private val trianglePath = Path()
private val rectF = RectF()
private val triangleSize = resources.getDimensionPixelSize(R.dimen.triangle_size_20dp).toFloat()
private val cornerRadius = resources.getDimensionPixelSize(R.dimen.corner_radius_4dp).toFloat()
constructor(context: Context?):super(context)
constructor(context: Context?, attrs: AttributeSet?):super(context, attrs)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int):super(context, attrs, defStyleAttr)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)
init{
paint.style = Paint.Style.FILL
paint.color = Color.CYAN
}
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
super.onLayout(changed, left, top, right, bottom)
val myWidth = (right - left).toFloat()
val myHeight = (bottom - top).toFloat()
val centerX = myWidth / 2f
val lowerEdgeY = myHeight * 0.8f
rectF.set(0f, 0f, myWidth, lowerEdgeY)
rectPath.addRoundRect(rectF,cornerRadius, cornerRadius, Path.Direction.CW )
val delta = triangleSize * 0.5f
trianglePath.moveTo(centerX - delta, lowerEdgeY)
trianglePath.lineTo(centerX + delta, lowerEdgeY)
trianglePath.lineTo(centerX, myHeight)
trianglePath.close()
}
override fun onDraw(canvas: Canvas?) {
canvas?.drawPath(rectPath, paint)
canvas?.drawPath(trianglePath, paint)
super.onDraw(canvas)
}
}
这篇关于如何修复 android.widget.TextView() 需要 api 21 错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
更多推荐
[db:关键词]
发布评论