给文字描边的一个简单实现原理就是先写一个大的文字,再写一个小的文字贴在大的上面就可以实现文字描边的原理,下面就是重写TextView的一个简单类,直接复制创建就可以拿来使用了,在xml声明即可;
public class StrokeTextView extends TextView {
private TextView borderText = null;///用于描边的TextView
public StrokeTextView(Context context) {
super(context);
borderText = new TextView(context);
init();
}
public StrokeTextView(Context context, AttributeSet attrs) {
super(context, attrs);
borderText = new TextView(context,attrs);
init();
}
public StrokeTextView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
borderText = new TextView(context,attrs,defStyle);
init();
}
public void init(){
TextPaint tp1 = borderText.getPaint();
tp1.setStrokeWidth(4); //设置描边宽度
tp1.setStyle(Paint.Style.STROKE); //对文字只描边
borderText.setTextColor(getResources().getColor(R.color.red)); //设置描边颜色
borderText.setGravity(getGravity());
}
@Override
public void setLayoutParams (ViewGroup.LayoutParams params){
super.setLayoutParams(params);
borderText.setLayoutParams(params);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
CharSequence tt = borderText.getText();
//两个TextView上的文字必须一致
if(tt== null || !tt.equals(this.getText())){
borderText.setText(getText());
this.postInvalidate();
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
borderText.measure(widthMeasureSpec, heightMeasureSpec);
}
protected void onLayout (boolean changed, int left, int top, int right, int bottom){
super.onLayout(changed, left, top, right, bottom);
borderText.layout(left, top, right, bottom);
}
@Override
protected void onDraw(Canvas canvas) {
borderText.draw(canvas);
super.onDraw(canvas);
}
//设置描边颜色,比如(getResources().getColor(R.color.red))
public void setBianColor(int is){
borderText.setTextColor(is);
}
}
在xml中声明:
<你工程的包名.StrokeTextView
android:id="@+id/phone_num_txt"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="left|center"
android:textColor="#ffffff"
android:textSize="20sp" />