有个需求,要为指定文字描边,于是就写了个小东西,大家可以扩展着用 原理就是在后面创建一个一摸一样的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设置边框颜色