2015-10-24 24 views
5

Kodu:

private void setSpans(Editable s, @ColorInt int backgroundColor) { 

    BackgroundColorSpan[] spans = s.getSpans(0, s.length(), BackgroundColorSpan.class); 
    String[] words; 
    if (s.toString().endsWith(" ")) { 
     words = (s.toString() + "X").split("\\s"); 
    } else { 
     words = s.toString().split("\\s"); 
    } 
    int completedWordsCount = words.length - 1; 
    if (spans.length != completedWordsCount) { 
     for (BackgroundColorSpan span : spans) { 
      s.removeSpan(span); 
     } 

     int currentIndex = 0; 
     for (int i = 0; i < words.length-1; i++) { 
      s.setSpan(new CustomDrawble(Color.GRAY, Color.WHITE), currentIndex, currentIndex + words[i].length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
      currentIndex += words[i].length() + 1; 
     } 
    } 

fonksiyonu Üstü spannable String oluşturarak ve ona Border eklemek için yararlıdır.Android'de yazılabilir dize arasında nasıl boşluk yapılır?

public class CustomDrawble extends ReplacementSpan { 

private int mBackgroundColor; 
private int mForegroundColor; 

public CustomDrawble(int backgroundColor, int foregroundColor) { 
    this.mBackgroundColor = backgroundColor; 
    this.mForegroundColor = foregroundColor; 
} 

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

} 

@Override 
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) { 
    float padding = 4f; 

    RectF rect = new RectF(x, top + 3, x + measureText(paint, text, start, end) + 10, bottom + 10); 
    paint.setColor(mBackgroundColor); 
    canvas.drawRoundRect(rect, 10,10,paint); 
    paint.setColor(mForegroundColor); 
    canvas.drawText(text, start, end, x, y, paint); 

} 

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

Ben yukarıdan alıyorum sonucudur: Ben aşağıdaki sınıf arıyorum

yukarıdaki kod ile sorun: arasındaki boşluğu nasıl eklenir

  • iki spannable dizeleri?
  • Dikdörtgenin başlangıcına ve dikdörtgenin sonuna benzer bir dizenin ilk karakterine nasıl boşluk ekleyebilirim. Bu kodla boşluk eklemek için çalıştı:

    RectF rect = new RectF(x+10, top + 3, x + measureText(paint, text, start, end) + 10, bottom + 10); 
    

ama bana bu çarpık sonuç verdi: Yanlış değilsem

enter image description here

sonra yukarıdaki kod ile sorun iki spannable dizgisi arasında yeterli boşluk yok.

Nasıl düzeltebilirim?

Düzenleme-1 biraz başlangıç ​​noktasından kesiyor ilki bu RectF rect = new RectF(x - 5, top + 3, x + measureText(paint, text, start, end)+5, bottom + 10);

enter image description here

bak Kullanılan

. Ancak yukarıdaki yapılandırmayı kullansaydım iki dizede yeterli alanım yok. Bu ana konu.

cevap

1

aralıkları arasında hiçbir boşluk eklemek zorunda sorunu çözecektir sizin rect sonundan itibaren fazladan piksel Çıkarma

yüzden böyle sağ

için param gelen + 10 kaldırın:

da
RectF rect = new RectF(x, top + 3, x + measureText(paint, text, start, end), bottom + 10); 

eklemek başlangıçta alan 'un başlangıcında bazı negatif marjlar koydu:

RectF rect = new RectF(x - 5, top + 3, x + measureText(paint, text, start, end), bottom + 10); 

aşağıdaki görüntü görsel olarak bu açıklayacaktır:

dig

+0

Aslında ben denedim negatif bir değer bu soruyu :) BTW Düzenlemenizle 1 yapabilirsiniz için bir Checkout Düzenleme-1 bölümünde –

+0

son düzenleme var göndermeden önce soldan ve sağdan birkaç tane daha fazla piksel parçalamak.Bu yüzden 5 piksel yerine her iki taraf 3 –

+0

ile deneylerim Aslında bu yüzden şu soruyu sordum: İki yayılabilir dizge arasında boşluk nasıl sağlanır :) –

İlgili konular