2013-02-26 30 views
5

Ne yapmak isterim? Yaptıklarımı enter image description hereBir TextView nasıl çizilir?

(mavi beyaz değişecek)?
Metin Görünümü'nü, istediğim şeye çok yakın bir şekilde özetleyen bir sınıf buldum. Sorun şu ki, kontur rengini herhangi bir renge değiştiremedim, her zaman siyah çiziyor. Kenarlık rengi beyaz olarak nasıl ayarlanır?

benim çıkış nedir: benim kodlardır
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

Lütfen resme bakın, yapmak istediğim konuyla alakasız. –

+0

Merhaba Mustafa, Sorunu sizin sorununuza gönderdim. "Gölge" geçici çözümünü kullanmak yerine, işe yarayıp yaramadığını kontrol edin. Teşekkürler. – Elye

+0

[Android textview anahat metninin olası kopyası] (http://stackoverflow.com/questions/3182393/android-textview-outline-text) –

cevap

4

1) TextView'un nesnesi oluşturmak Soruşturma

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

aşağıdaki şekilde getWhiteBorderPaint() yöntemini değiştirmek gerekir.

+0

hayır, işe yaramadı. –

0

aşağıdaki gibi onun beraberlik yöntemine

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

3) set TextView'un en xml tarafı bunu yapın)

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

2 TextView

uzanır Bu soruya verilen orijinal problemin içine. Çözümü buldum.

Birincisi, DST_OUT İkincisi

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

karartmak için değiştirmek orijinal metin rengi kaydedin ve amaçlanan anahat renk yapip, anahat çizin ve ardından orijinal metin rengini geri yükleyin.

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