2013-02-26 49 views
5

我想要做什么?(蓝色会变成白色) enter image description here如何勾勒TextView?

我做了什么?
我发现了一个扩展TextView的类,它能够将textview放在非常接近我想要的位置的位置。问题是我无法将笔画颜色更改为任何颜色,它总是以黑色绘制。如何将边框颜色设置为白色?

什么是我的输出:
enter image description here

哪里是我的代码?

public class TypeFaceTextView extends TextView { 

private static Paint getWhiteBorderPaint(){ 
    Paint p = new Paint(Color.WHITE); 
    return p; 
} 

private static final Paint BLACK_BORDER_PAINT = getWhiteBorderPaint(); 

static { 
    BLACK_BORDER_PAINT.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); 
} 

@Override 
public void setText(CharSequence text, BufferType type) { 

    super.setText(String.format(text.toString()), type); 
} 

private static final int BORDER_WIDTH = 1; 

private Typeface typeface; 

public TypeFaceTextView(Context context) { 
    super(context); 
} 

public TypeFaceTextView(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    setDrawingCacheEnabled(false); 

    setTypeface(attrs); 
} 

private void setTypeface(AttributeSet attrs) { 
    final String typefaceFileName = attrs.getAttributeValue(null, "typeface"); 
    if (typefaceFileName != null) { 
     typeface = Typeface.createFromAsset(getContext().getAssets(), typefaceFileName); 
    } 

    setTypeface(typeface); 
} 

public TypeFaceTextView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 

    setTypeface(attrs); 
} 

@Override 
public void draw(Canvas aCanvas) { 
    aCanvas.saveLayer(null, BLACK_BORDER_PAINT, Canvas.HAS_ALPHA_LAYER_SAVE_FLAG 
      | Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.MATRIX_SAVE_FLAG); 

    drawBackground(aCanvas, -BORDER_WIDTH, -BORDER_WIDTH); 
    drawBackground(aCanvas, BORDER_WIDTH + BORDER_WIDTH, 0); 
    drawBackground(aCanvas, 0, BORDER_WIDTH + BORDER_WIDTH); 
    drawBackground(aCanvas, -BORDER_WIDTH - BORDER_WIDTH, 0); 

    aCanvas.restore(); 
    super.draw(aCanvas); 

} 

private void drawBackground(Canvas aCanvas, int aDX, int aDY) { 
    aCanvas.translate(aDX, aDY); 
    super.draw(aCanvas); 
} 
} 
+0

请看图片,这与我想要做的事无关。 – 2013-02-26 14:49:41

+0

嗨穆斯塔法,我已经发布了解决您的问题。请检查它是否有效,而不是使用“影子”解决方法。谢谢。 – Elye 2015-05-02 12:40:42

+0

[Android的textview大纲文本]的可能重复(http://stackoverflow.com/questions/3182393/android-textview-outline-text) – 2015-08-11 15:08:39

回答

4

1)创建TextView的对象扩展的TextView

public class YourTextView extends TextView { ......... 

2)做这在其绘制方法

@Override 
public void draw(Canvas canvas) { 
     for (int i = 0; i < 5; i++) { 
     super.draw(canvas); 
    } 
} 

3)设置的TextView的XML侧面,如下

android:shadowColor="@color/white" 
android:shadowRadius="5" 
0

你需要改变你的getWhiteBorderPaint()方法如下:

private static Paint getWhiteBorderPaint(){ 
    Paint p = new Paint(); 
    p.setColor(Color.WHITE); 
    return p; 
} 

Paint constructor只需bitmasked标志,并且不支持任意整数作为参数。

+0

不,不起作用。 – 2013-02-28 16:07:03

0

考察转化为这个问题所陈述的原始问题。找到解决方案。

首先,更改DST_OUT变暗

static { 
    BLACK_BORDER_PAINT.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DARKEN)); 
} 

其次,保存原来的文本颜色,并把预期的轮廓颜色了,画出轮廓,然后恢复原来的文本颜色。

@Override 
public void draw(Canvas aCanvas) { 
    int originalColor = this.getCurrentTextColor(); 
    this.setTextColor(0xff000000); //set it to white. 

    aCanvas.saveLayer(null, borderPaint, Canvas.HAS_ALPHA_LAYER_SAVE_FLAG 
      | Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.MATRIX_SAVE_FLAG); 

     drawBackground(aCanvas, -BORDER_WIDTH, -BORDER_WIDTH); 
     drawBackground(aCanvas, BORDER_WIDTH + BORDER_WIDTH, 0); 
     drawBackground(aCanvas, 0, BORDER_WIDTH + BORDER_WIDTH); 
     drawBackground(aCanvas, -BORDER_WIDTH - BORDER_WIDTH, 0); 

    this.setTextColor(originalColor); 
    aCanvas.restore(); 
    super.draw(aCanvas); 
} 
相关问题