-
运行效果
-
思路
-
如果把两个等同的textviewd叠在一起,并给定不同颜色,这样既可以实现
-
首先实现TextView的子类,并实例化描边的TextView,设置相关的配置
public class YXJMEView extends TextView {
private TextView sTextView;
public YXJMEView(Context context) {
this(context,null);
}
public YXJMEView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public YXJMEView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
sTextView = new TextView(context,attrs,defStyleAttr);
Paint paint = sTextView.getPaint();
paint.setStyle(Paint.Style.STROKE);
//描边的宽度
paint.setStrokeWidth(10);
sTextView.setTextColor(Color.BLUE);
sTextView.setGravity(getGravity());
}
}
- 测量TextView的显示范围,创建的新view必须要和父View一样(范围,值)
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
CharSequence str = sTextView.getText();
if (sTextView!=null||!sTextView.equals(str)){
sTextView.setText(getText());
postInvalidate();
}
sTextView.measure(widthMeasureSpec,heightMeasureSpec);
}
- 显示的位置
@Override
public void setLayoutParams(ViewGroup.LayoutParams params) {
super.setLayoutParams(params);
sTextView.setLayoutParams(params);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
sTextView.layout(left,top,right,bottom);
}
- 最后 sTextView.draw(canvas)一定要在super.onDraw(canvas);之前执行
@Override
protected void onDraw(Canvas canvas) {
sTextView.draw(canvas);
super.onDraw(canvas);
}