安卓textview 填充和描边
时间: 2024-01-30 13:02:13 浏览: 22
安卓的TextView控件默认只支持填充效果,如果需要实现描边效果,可以通过以下两种方式实现:
1. 使用ShadowEffect
在XML布局文件中,设置TextView的android:shadowColor为描边颜色,android:shadowRadius为描边宽度,即可实现描边效果。
示例代码:
```
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textSize="24sp"
android:textColor="#ffffff"
android:shadowColor="#000000"
android:shadowRadius="2"/>
```
2. 使用SpannableString
可以通过SpannableString实现TextView的填充和描边效果。创建一个SpannableString对象,然后使用SpannableString的setSpan()方法设置ForegroundColorSpan和OutlineSpan,即可实现填充和描边效果。
示例代码:
```
SpannableString spannableString = new SpannableString("Hello World!");
spannableString.setSpan(new ForegroundColorSpan(Color.WHITE), 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(new OutlineSpan(Color.BLACK, 2), 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
```
其中,OutlineSpan是自定义的一个类,用于实现描边效果,代码如下:
```
public class OutlineSpan extends ReplacementSpan {
private int mOutlineColor;
private float mOutlineWidth;
public OutlineSpan(int outlineColor, float outlineWidth) {
mOutlineColor = outlineColor;
mOutlineWidth = outlineWidth;
}
@Override
public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
return (int) (paint.measureText(text, start, end) + mOutlineWidth * 2);
}
@Override
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
float oldStrokeWidth = paint.getStrokeWidth();
Paint.Style oldStyle = paint.getStyle();
int oldColor = paint.getColor();
paint.setStrokeWidth(mOutlineWidth);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(mOutlineColor);
canvas.drawText(text, start, end, x, y, paint);
paint.setStrokeWidth(oldStrokeWidth);
paint.setStyle(oldStyle);
paint.setColor(oldColor);
canvas.drawText(text, start, end, x, y, paint);
}
}
```