安卓文字描边

有个需求,要为指定文字描边,于是就写了个小东西,大家可以扩展着用
原理就是在后面创建一个一摸一样的textview,然后后面的textview只绘制边框。
代码如下:

import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Typeface
import android.util.AttributeSet
import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatTextView
import com.damailab.camera.utils.DisplayUtil

/**
 * Created by Mafanwei on 2020/9/3.
 */
open class StrokeTextView : AppCompatTextView {
    private val outLineTextView: AppCompatTextView
    private var outLineColor = "#FFEECB"

    constructor(context: Context) : super(context) {
        outLineTextView = AppCompatTextView(context)
        init()
    }

    constructor(context: Context, attrs: AttributeSet? = null) : super(context, attrs) {
        outLineTextView = AppCompatTextView(context, attrs)
        init()
    }

    constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : super(context, attrs, defStyleAttr) {
        outLineTextView = AppCompatTextView(context, attrs, defStyleAttr)
        init()
    }

    private fun init() {
        val paint = outLineTextView.paint
        paint.strokeWidth = 10f
        paint.style = Paint.Style.STROKE
        outLineTextView.setTextColor(Color.parseColor(outLineColor))
        outLineTextView.gravity = gravity
    }

    override fun setLayoutParams(params: ViewGroup.LayoutParams?) {
        super.setLayoutParams(params)
        outLineTextView.layoutParams = params
    }

    fun setOutLineTextViewFont(typeface: Typeface) {
        outLineTextView.typeface = typeface
    }

    fun setOutLineColor(colorString: String) {
        outLineColor = colorString
        outLineTextView.setTextColor(Color.parseColor(outLineColor))
    }

	fun setStrokeWidth(width: Float) {
        val paint = outLineTextView.paint
        paint.strokeWidth = width
    }

    override fun setTextSize(size: Float) {
        super.setTextSize(size)
        outLineTextView.textSize = size
    }

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        val outLineText = outLineTextView.text
        if (outLineText == null || outLineText != this.text) {
            outLineTextView.text = this.text
            postInvalidate()
        }
        outLineTextView.measure(widthMeasureSpec, heightMeasureSpec)
    }

    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
        super.onLayout(changed, left, top, right, bottom)
        outLineTextView.layout(left, top, right, bottom)
    }

    override fun onDraw(canvas: Canvas?) {
        outLineTextView.draw(canvas)
        super.onDraw(canvas)
    }
}

使用和textview完全一样,如果要自定义字体,需要调用

setOutLineTextViewFont

才能使内外text字体一致。
调用

setStrokeWidth

设置描边粗细

调用

setOutLineColor

设置边框颜色

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值