Android 自定义TextView实现文字描边效果
效果如下
自定义两个属性
//attrs.xml <!-- 文本描边颜色 --> <attr name="strokeTextColor" format="reference|color" /> <!-- 文本描边粗细 --> <attr name="strokeTextWidth" format="reference|integer" />
实现类
public class StrokeTextView extends androidx.appcompat.widget.AppCompatTextView {
private static final int[] STROKE_ATTRS = new int[]{R.attr.strokeTextColor, R.attr.strokeTextWidth};
private @ColorInt int strokeColor = 0;
private int strokeWidth = 3;
public StrokeTextView(Context context) {
this(context, null);
}
public StrokeTextView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, android.R.attr.textViewStyle);
}
public StrokeTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray typedArray = context.obtainStyledAttributes(attrs, STROKE_ATTRS, defStyleAttr, 0);
strokeColor = typedArray.getColor(0, 0);
strokeWidth = typedArray.getInt(1, 3);
typedArray.recycle();
}
public void setStrokeColor(@ColorInt int color) {
strokeColor = color;
invalidate();
}
public void setStrokeWidth(int width) {
strokeWidth = width;
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
TextPaint wkPaint = getLayout().getPaint();
int preColor = wkPaint.getColor();
Paint.Style prePaintStyle = wkPaint.getStyle();
// apply stroke paint
wkPaint.setColor(strokeColor);
wkPaint.setStrokeWidth(strokeWidth);
wkPaint.setStyle(Paint.Style.STROKE);
// draw text outline
getLayout().draw(canvas);
// restore paint
wkPaint.setColor(preColor);
wkPaint.setStrokeWidth(0);
wkPaint.setStyle(prePaintStyle);
super.onDraw(canvas);
}
}
在onDraw方法中,拿到负责绘制文本的Layout对象,对其Paint应用描边设置后绘制一遍,就是绘制的文字描边效果。
原文地址:https://blog.csdn.net/Roy1986613/article/details/142950216
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!