2013-02-26 7 views
5

Was ich machen möchte? (blau als weiß geändert werden) enter image description hereWie skizzieren Sie eine TextView?

Was habe ich?
Ich habe eine Klasse gefunden, die TextView erweitert, die in der Lage ist, Textview sehr nahe an dem zu gestalten, was ich möchte. Das Problem ist, dass ich die Strichfarbe nicht auf irgendeine Farbe ändern konnte, sondern immer schwarz gezeichnet. Wie wird die Rahmenfarbe als weiß eingestellt?

Was ist meine Ausgabe:
enter image description here

Wo meine Codes sind?

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

Bitte schauen Sie sich das Bild an, es ist irrelevant, was ich machen möchte. –

+0

Hallo Mustafa, ich habe die Lösung für Ihr Problem gepostet. Überprüfen Sie es, wenn es funktioniert, anstatt den "Schatten" Workaround zu verwenden. Vielen Dank. – Elye

+0

mögliches Duplikat von [Textansicht für Android-Text] (http://stackoverflow.com/questions/3182393/android-textview-outline-text) –

Antwort

4

1) Erstellen Ihre Textview Objekt erstreckt Textview

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

2) Tun Sie dies auf ihre Streck-Verfahren

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

3) gesetzt Textview XML-Seite, wie unten

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

Sie benötigen getWhiteBorderPaint() -Methode auf die folgenden Änderungen:

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

Die Paint constructor nur bitmasked Flaggen nimmt und nicht willkürlich Ints als Parameter nicht unterstützt.

+0

nein, es hat nicht funktioniert. –

0

Suchte in das ursprüngliche Problem, das durch diese Frage angegeben wird. Ich habe die Lösung gefunden.

Erstens ändern sich DST_OUT

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

Zweitens zu verdunkeln, die ursprüngliche Textfarbe speichern, und legen Sie die Konturfarbe oben gedacht, die Umrisse zeichnen, und dann die ursprüngliche Textfarbe wiederherzustellen.

@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); 
} 
Verwandte Themen