Dantotsu/app/src/main/java/ani/dantotsu/others/OutlineTextView.kt
Finnley Somdahl afa960c808 reformat
2023-12-01 01:22:15 -06:00

91 lines
2.3 KiB
Kotlin

package ani.dantotsu.others
import android.content.Context
import android.graphics.Canvas
import android.graphics.Paint
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatTextView
import ani.dantotsu.R
class OutlineTextView : AppCompatTextView {
private val defaultStrokeWidth = 0F
private var isDrawing: Boolean = false
private var strokeColor: Int = 0
private var strokeWidth: Float = 0.toFloat()
constructor(context: Context) : super(context) {
initResources(context, null)
}
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
initResources(context, attrs)
}
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
context,
attrs,
defStyleAttr
) {
initResources(context, attrs)
}
private fun initResources(context: Context?, attrs: AttributeSet?) {
if (attrs != null) {
val a = context?.obtainStyledAttributes(attrs, R.styleable.OutlineTextView)
strokeColor = a!!.getColor(
R.styleable.OutlineTextView_outlineColor,
currentTextColor
)
strokeWidth = a.getFloat(
R.styleable.OutlineTextView_outlineWidth,
defaultStrokeWidth
)
a.recycle()
} else {
strokeColor = currentTextColor
strokeWidth = defaultStrokeWidth
}
setStrokeWidth(strokeWidth)
}
private fun setStrokeWidth(width: Float) {
strokeWidth = width.toPx(context)
}
private fun Float.toPx(context: Context) =
(this * context.resources.displayMetrics.scaledDensity + 0.5F)
override fun invalidate() {
if (isDrawing) return
super.invalidate()
}
override fun onDraw(canvas: Canvas) {
if (strokeWidth > 0) {
isDrawing = true
super.onDraw(canvas)
paint.style = Paint.Style.STROKE
paint.strokeWidth = strokeWidth
val colorTmp = paint.color
setTextColor(strokeColor)
super.onDraw(canvas)
setTextColor(colorTmp)
paint.style = Paint.Style.FILL
isDrawing = false
} else {
super.onDraw(canvas)
}
}
}