2013-10-10 13 views
26

का हिस्सा पीछे मैं के रूप में इस छवि पर देखा कुछ इसी तरह बनाना चाहेंगे: enter image description hereएंड्रॉयड SpannableString सेट पृष्ठभूमि पाठ

मैं छोड़कर नारंगी आयत गोल, SpannableStringBuilder साथ evertyhing बनाने में कामयाब रहे। मैं पृष्ठभूमि को रंगरोलस्पैन के साथ उस रंग में सेट कर सकता हूं, लेकिन मुझे इसे गोल करने का कोई तरीका नहीं मिल रहा है। कोई विचार मैं इसे कैसे प्राप्त कर सकता हूं?

अग्रिम धन्यवाद!

संपादित करें:

stringBuilder.SetSpan(new BackgroundColorSpan(Application.Context.Resources.GetColor(Resource.Color.orangeColor)), stringBuilder.Length() - length, stringBuilder.Length(), SpanTypes.ExclusiveExclusive); 
+0

क्या आप पृष्ठभूमि रंग का उपयोग कर पृष्ठभूमि रंग सेट करने के लिए उपयोग किए गए कोड को पोस्ट कर सकते हैं? – Ogen

+0

कृपया ऐसा करें रूजवेल्ट –

+0

मैंने अपना प्रश्न अपडेट किया :) – Roosevelt

उत्तर

21

मैं pskink के सुझाव के आधार पर, मेरी समस्या को हल करने में कामयाब रहे।

public class RoundedBackgroundSpan : ReplacementSpan 
{ 
    public override void Draw(Canvas canvas, ICharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) 
    { 
     var rect = new RectF(x, top, x + MeasureText(paint, text, start, end), bottom); 
     paint.Color = Application.Context.Resources.GetColor(Resource.Color.nextTimeBackgroundColor); 
     canvas.DrawRoundRect(rect, Application.Context.Resources.GetDimensionPixelSize(Resource.Dimension.localRouteDetailsRoundRectValue), Application.Context.Resources.GetDimensionPixelSize(Resource.Dimension.localRouteDetailsRoundRectValue), paint); 
     paint.Color = Application.Context.Resources.GetColor(Resource.Color.nextTimeTextColor); 
     canvas.DrawText(text, start, end, x, y, paint); 
    } 

    public override int GetSize(Paint paint, ICharSequence text, int start, int end, Paint.FontMetricsInt fm) 
    { 
     return Math.Round(MeasureText(paint, text, start, end)); 
    } 

    private float MeasureText(Paint paint, ICharSequence text, int start, int end) 
    { 
     return paint.MeasureText(text, start, end); 
    } 
} 

उदाहरण उपयोग: यहाँ मेरी कक्षा है

var stringBuilder = new SpannableStringBuilder(); 
var stringToAppend = "hello world"; 
stringBuilder.Append(stringToAppend); 
stringBuilder.SetSpan(new RoundedBackgroundSpan(), stringBuilder.Length() - stringToAppend.Length, stringBuilder.Length(), SpanTypes.ExclusiveExclusive); 
+2

मुझे खुशी है कि आपने इसे स्वयं हल कर लिया है, जब आप पूर्ण कार्य कोड – pskink

+0

हाय रूजवेल्ट लेने के बजाय कुछ प्रयास करते हैं तो यह बेहतर सबक है। क्या आप कृपया इस http://stackoverflow.com/questions/32293229/how-to-add-padding-stroke-and-radius-to-custom-text-with-spannable में देख सकते हैं। ReplacementSpan काम नहीं कर रहा है। – jason

+0

यह जावा शैली की तरह नहीं दिखता है ... वैसे भी, क्या आप इस प्रश्न को देख सकते हैं: http://stackoverflow.com/q/41938378/878126 –

3

सिर्फ एक शब्द: मैं Xamarin.Android उपयोग कर रहा हूँ, लेकिन यहाँ मेरे कोड है ReplacementSpan

+0

धन्यवाद, मैं अभी इसे देख लूंगा। – Roosevelt

34

किसी को रूजवेल्ट कोड नमूने के साथ कठिनाई हो रही है, तो (? मुझे यकीन है कि था, हो सकता है, क्योंकि यह Xamarin.Android है), यहाँ एक में एक अनुवाद है अधिक बुनियादी एंड्रॉयड जावा संस्करण:


    public class RoundedBackgroundSpan extends ReplacementSpan { 

     private static int CORNER_RADIUS = 8; 
     private int backgroundColor = 0; 
     private int textColor = 0; 

     public RoundedBackgroundSpan(Context context) { 
      super(); 
      backgroundColor = context.getResources().getColor(R.color.gray); 
      textColor = context.getResources().getColor(R.color.white); 
     } 

     @Override 
     public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) { 
      RectF rect = new RectF(x, top, x + measureText(paint, text, start, end), bottom); 
      paint.setColor(backgroundColor); 
      canvas.drawRoundRect(rect, CORNER_RADIUS, CORNER_RADIUS, paint); 
      paint.setColor(textColor); 
      canvas.drawText(text, start, end, x, y, paint); 
     } 

     @Override 
     public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) { 
      return Math.round(paint.measureText(text, start, end)); 
     } 

     private float measureText(Paint paint, CharSequence text, int start, int end) { 
      return paint.measureText(text, start, end); 
     } 
    } 

और उपयोग के लिए, निम्नलिखित कोड खंड एक गतिविधि से लिया और मूल रूप से किया जाता है एक अच्छा गोल-कोने पृष्ठभूमि डालता है प्रत्येक टैग स्ट्रिंग के आस-पास, प्रत्येक टैग के बीच एक स्पेस बफर के साथ। ध्यान दें कि टिप्पणी की गई रेखा सिर्फ एक पृष्ठभूमि रंग में रखती है, जो अच्छी लगती है ...


    SpannableStringBuilder stringBuilder = new SpannableStringBuilder(); 

    String between = ""; 
    for (String tag : eventListing.getTags()) { 
     stringBuilder.append(between); 
     if (between.length() == 0) between = " "; 
     String thisTag = " "+tag+" "; 
     stringBuilder.append(thisTag); 
     stringBuilder.setSpan(new RoundedBackgroundSpan(this), stringBuilder.length() - thisTag.length(), stringBuilder.length() - thisTag.length() + thisTag.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
     //stringBuilder.setSpan(new BackgroundColorSpan(getResources().getColor(R.color.gray)), stringBuilder.length() - thisTag.length(), stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    } 

    TextView tv = new TextView(this); 
    tv.setText(stringBuilder); 
+0

कमाल! इसके लिए धन्यवाद! –

संबंधित मुद्दे