2013-03-12 12 views
8

Szukam tekstu w wersji tekstowej, który wygląda jak enter image description here. Użyłem poniżej kod do wdrożenia tego ..Dwa różne style w jednym widoku tekstowym z różną grawitacją i wysokością

SpannableString text; 
    text = new SpannableString(bal_dollars.getText()); 
    int index = bal_dollars.getText().toString().indexOf("."); 
    text.setSpan(new TextAppearanceSpan(getApplicationContext(), 
      R.style.HeroGraphicBalanceSmallFont), index, bal_dollars 
      .getText().toString().length(), 
      Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
    bal_dollars.setText(text, TextView.BufferType.SPANNABLE); 

oto styl stosowany w rozpiętości ..

<style name="HeroGraphicBalanceSmallFont" parent="@android:style/TextAppearance.Medium"> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:textSize">50sp</item> 
    <item name="android:singleLine">true</item> 
    <item name="android:layout_height">match_parent</item> 
    <item name="android:layout_gravity">top|right</item> 
    <item name="android:paddingBottom">30dp</item> 
    <item name="android:gravity">top|right</item> 
    <item name="android:textColor">@color/status_text</item> 
    <item name="customFont">fonts/HeroicCondensedMedium.ttf</item> 
</style> 

wszystko wygląda w porządku z wyjątkiem rozstawu docelowej rozpiętości części tekstu tj dziesiętnych grawitacja .. enter image description here. Wypróbowałem wszystkie atrybuty xml. Proszę pomóc

+2

Chciałbym spojrzeć w atrybucie '' baselineShift' z TextPaint'. – kcoppock

+1

dzięki @kcoppock, wykopałem więcej w rozszerzeniu klasy 'MetricAffectingSpan' i zmianie atrybutu' baselineshift'. To działało jak czar :) – CodeFury

+2

1,5 roku za późno .. ale czy [SuperscriptSpan] (http://developer.android.com/reference/android/text/style/SuperscriptSpan.html) nie działa? – andyandy

Odpowiedz

11

I pęknięty. Publikuję to, ponieważ może być pomocne dla innych i dzięki @kcoppock dla podpowiedzi. Mam rozszerzoną klasę MetricAffectingSpan, która wpływa na formatowanie tekstu na poziomie znaku w sposób, który zmienia szerokość lub wysokość znaków, które rozszerzają tę klasę.

public class CustomCharacterSpan extends MetricAffectingSpan { 
double ratio = 0.5; 

public CustomCharacterSpan() { 
} 

public CustomCharacterSpan(double ratio) { 
    this.ratio = ratio; 
} 

@Override 
public void updateDrawState(TextPaint paint) { 
    paint.baselineShift += (int) (paint.ascent() * ratio); 
} 

@Override 
public void updateMeasureState(TextPaint paint) { 
    paint.baselineShift += (int) (paint.ascent() * ratio); 
}} 

użycie tego zaktualizować tekst w widokach ..

String string = tv.getText().toString(); 
    SpannableString text = new SpannableString(tv.getText()); 
    int index = tv.getText().toString().indexOf("."); 
    text.setSpan(new CustomCharacterSpan(), index, string.length(), 
      SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);//u can use ur own ratio using another constructor 
    tv.setText(text, TextView.BufferType.SPANNABLE);