2015-04-16 7 views
10

Potrzebuję wykonać projekt z układu Photoshop. W układach jest kilka czcionek. Projektant dał mi te czcionki. Ale na układzie w Photoshopie używa odstępów między literami. Jak mogę zrealizować to w Android TextView? Znalazłem jedno rozwiązanie:Jak dokonać odstępu między literami w Androidzie TextView?

answer on stackoverflow

answer two

ale jeśli robię myTextView extends TextView działać źle. Jeśli dostosuję się do jednego urządzenia, na urządzeniu z większym wyświetlaczem odstępy pomiędzy przyrostami liter nie są proporcjonalne.

EDIT

public class MyTextView extends TextView { 
    private float letterSpacing = 0.0f; 
    private CharSequence originalText = ""; 
    private Typeface typeface; 

    public MyTextView(Context context) { 
     this(context, null); 
     isInEditMode(); 
    } 

    public MyTextView(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
     isInEditMode(); 
    } 

    public MyTextView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     TypedArray attributesArray = getResources().obtainAttributes(attrs, R.styleable.MyTextView); 
     letterSpacing = attributesArray.getDimension(R.styleable.MyTextView_letterSpacing, 0.0f); 
     String fontName = attributesArray.getString(R.styleable.MyTextView_fontName); 
     if(!this.isInEditMode()) { 
      if (null == fontName) { 
       typeface = Fonts.getBlockBertholdRegular(context); 
      } else { 
       typeface = Fonts.get(context, fontName); 
      } 
      super.setTypeface(typeface); 
     } 
     originalText = super.getText(); 
     applyLetterSpacing(); 
     this.invalidate(); 
    } 

    public float getLetterSpacing() { 
     return letterSpacing; 
    } 

    public void setLetterSpacing(float letterSpacing) { 
     this.letterSpacing = letterSpacing; 
     applyLetterSpacing(); 
    } 

    @Override 
    public void setText(CharSequence text, BufferType type) { 
     originalText = text; 
     applyLetterSpacing(); 
    } 

    @Override 
    public CharSequence getText() { 
     return originalText; 
    } 

    private void applyLetterSpacing() { 
     if (this == null || this.originalText == null) return; 
     StringBuilder builder = new StringBuilder(); 
     for (int i = 0; i < originalText.length(); i++) { 
      String c = "" + originalText.charAt(i); 
      builder.append(c.toUpperCase()); 
      if (i + 1 < originalText.length()) { 
       builder.append("\u00A0"); 
      } 
     } 
     SpannableString finalText = new SpannableString(builder.toString()); 
     if (builder.toString().length() > 1) { 
      for (int i = 1; i < builder.toString().length(); i += 2) { 
       finalText.setSpan(new ScaleXSpan((letterSpacing + 1)/10), i, i + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
      } 
     } 

     super.setText(finalText, BufferType.SPANNABLE); 
     if(!this.isInEditMode()) { 
      super.setTypeface(typeface); 
     } 
    } 
} 
+0

„Gdybym przystosować do jednego devise” Czy możesz pokazać nam kod, w którym to zrobić? – Docteur

+0

kod nr. Robię to, zmieniając rozmiar, aż zbiegną się z photoshopem. – ip696

+0

Czy próbowałeś stworzyć niestandardowy 'textView'? ('myTextView rozszerza TextView') Jeśli tak, to co działa źle? – Docteur

Odpowiedz

7

Spróbuj użyć nowego TextView metoda API setLetterSpacing. See here

EDIT

Można również create your own font z przestrzeni wewnątrz samej czcionki i apply it to your TextView.

+0

nie ma żadnej metody setLetterSpanning – surhidamatya

+0

Odpowiedziałeś dokładnie na to samo, co ja, a ty odpowiadasz, że moja odpowiedź jest niepoprawna? – Docteur

+0

O ile mi wiadomo, jest to dostępne tylko w Androidzie 21 – ip696

4

Od 21 API można użyć

setLetterSpacing 

dokumentację można znaleźć here

+0

O ile mi wiadomo, jest to dostępne tylko w systemie Android 21 – ip696

+0

@ ip696 tak jest to dostępne tylko z API 21 – surhidamatya

+0

Próbowałem go na API 21 i nie działało dobrze – ip696