2013-02-26 46 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); 
} 
相關問題