2013-10-10 3 views
26

Я хотел бы создать что-то подобное, как показано на рисунке: enter image description hereAndroid SpannableString набор фон за часть текста

мне удалось создать evertyhing с SpannableStringBuilder, за исключением оранжевый прямоугольник с закругленными углами. Я могу установить фон на этот цвет с BackgroundColorSpan, но я не могу найти способ сделать его округленным. Любые идеи, как я могу это достичь?

Заранее благодарен!

EDIT: Я использую Xamarin.Android, но вот мой код:

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

Вы можете разместить код, используемый для установки цвета фона с помощью backgroundcolorspan? – Ogen

+0

Пожалуйста, сделайте это Roosevelt –

+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

Hi Roosevelt. Не могли бы вы заглянуть в этот http://stackoverflow.com/questions/32293229/how-to-add-padding-stroke-and-radius-to-custom-text-with-spannable.ReplacementSpan не работает. – jason

+0

Это не похоже на стиль Java ... В любом случае, можете ли вы проверить этот вопрос: http://stackoverflow.com/q/41938378/878126 –

3

только одно слово: ReplacementSpan

+0

Спасибо, я посмотрю на него прямо сейчас. – Roosevelt

34

Если кто испытывает трудности с образцом кода Рузвельта (? Я уверен был, может быть, потому что это Xamarin.Android), вот перевод в более базовой версии Android Java:


    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

awesome! Спасибо за это! –

 Смежные вопросы

  • Нет связанных вопросов^_^