2013-02-26 12 views
5

Co chcę zrobić? (niebieski zmieni się na biały) enter image description hereJak zarysować widok tekstu?

Co zrobiłem? Znalazłem klasę, która rozszerza TextView, który jest w stanie zarysować widok tekstu bardzo blisko tego, co chcę. Problem polega na tym, że nie mogłem zmienić koloru obrysu na dowolny kolor, rysuje zawsze jako czarny. Jak ustawić kolor obramowania jako biały?

Jakie jest moje wyjście:
enter image description here

Gdzie są moje kody?

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

Proszę spojrzeć na zdjęcie, nie ma znaczenia, co chcę zrobić. –

+0

Cześć Mustafa, opublikowałem rozwiązanie twojego problemu. Czy to sprawdzić, czy działa, zamiast korzystania z obejścia "cień". Dzięki. – Elye

+0

możliwy duplikat [tekstu konspektu tekstowego Androida] (http://stackoverflow.com/questions/3182393/android-textview-outline-text) –

Odpowiedz

4

1) utworzyć obiekt TextView rozciąga TextView

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

2) Czy to na jego metodę wyciągania

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

3) bocznej xml zestaw TextView jako poniżej

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

Musisz zmienić sposób swój getWhiteBorderPaint() na następujący:

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

The Paint constructor zajmuje tylko bitmasked flagi i nie obsługuje dowolne ints jako parametry.

+0

nie, to nie działa. –

0

Badane do pierwotnego problemu określonego przez to pytanie. Znaleziono rozwiązanie.

pierwsze, zmienić DST_OUT ciemnieć

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

drugie, zachować oryginalny kolor tekstu i umieścić przeznaczony konspektu kolor up, narysować szkic, a następnie przywrócić oryginalny kolor tekstu.

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