2013-02-26 265 views
5

मैं क्या करना चाहता हूं? (नीला सफेद के रूप में बदला जाएगा) enter image description hereटेक्स्ट व्यू को रेखांकित कैसे करें?

मैंने क्या किया?
मुझे एक कक्षा मिली है जो टेक्स्टव्यू को बढ़ाती है जो टेक्स्टव्यू को मेरे इच्छित चीज़ों के करीब रूपरेखा में रूपांतरित करने में सक्षम है। समस्या यह है कि मैं किसी भी रंग में स्ट्रोक रंग नहीं बदल सका, यह हमेशा काला के रूप में खींचता है। सफेद रंग के रूप में सीमा रंग कैसे सेट करें?

मेरी उत्पादन क्या है:
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

कृपया तस्वीर देखें, यह अप्रासंगिक है कि मैं क्या करना चाहता हूं। –

+0

हाय मुस्तफा, मैंने आपकी समस्या का समाधान पोस्ट किया है। "छाया" वर्कअराउंड का उपयोग करने के बजाय, अगर यह काम करता है तो इसे देखें। धन्यवाद। – Elye

+0

[एंड्रॉइड टेक्स्टव्यू रूपरेखा पाठ] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/3182393/android-textview-outline-text) –

उत्तर

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 के एक्सएमएल पक्ष पर क्या यह नीचे

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

इस यह नहीं लेकिन साथ प्रयोग करने की कोशिश की जा सकी: PorterDuff.Mode

http://developer.android.com/reference/android/graphics/PorterDuff.Mode.html

'जोड़ें' या 'साफ़ करें' करने के लिए इसे बदलने का प्रयास करें, यह मदद करता है उम्मीद है।

+0

मैंने उन सभी को एक-एक करके कोशिश की और काम नहीं किया। –

0

आप निम्न करने के लिए अपने getWhiteBorderPaint() विधि को बदलने की जरूरत:

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

Paint constructor केवल bitmasked लेता झंडे और पैरामीटर के रूप में मनमाने ढंग से ints समर्थन नहीं करता।

+0

नहीं, यह काम नहीं किया। –

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