Czy istnieje sposób na zwiększenie / zmniejszenie odstępu między literami / znakami? textScaleX - Literackie skaluje litery / znaki.
Kaymatrix
2
@Barts odpowiada na pytanie
bkurzius
2
Skalowanie tekstu na osi X nie jest właściwym sposobem obsługi kerningu lub śledzenia w systemie Android. Istnieje interfejs API dla Lollipopa, który to robi, jednak przed Lollipopem będziesz potrzebować niestandardowego widoku tekstu, aby to osiągnąć.
Elliott,
2
Nie wiem, jak to rozwiązanie zyskało tak wiele głosów za (+33, -24), czy ludzie po prostu ślepo oddają swoje głosy? letterSpacingvs textScaleXjaka ogromna różnica
Jimit Patel
230
Od API 21 istnieje możliwość ustawienia odstępów między literami. Możesz wywołać metodę setLetterSpacing lub ustawić ją w XML z atrybutem letterSpacing .
To faktycznie nie działa, gdy jest ustawione w XML. Otrzymuję taki błąd:"1.2dp" in attribute "letterSpacing" cannot be converted to float."
dopatraman
20
@dopatraman Musisz ominąć jednostki, wpisz po prostu wartość: android: letterSpacing = "1.2" zamiast android: letterSpacing = "1.2dp"
JerabekJakub
12
Wiedząc, że 31% urządzeń nie obsługuje API 21, jak byś to zrobił w poprzednich wersjach?
ninjaneer
25
Zwróć uwagę, że wartość odstępu między literami nie jest wyrażona w dp / sp, ale w jednostkach „EM”. Typowe wartości dla niewielkiego rozszerzenia będą wynosić około 0,05. Wartości ujemne zawężają tekst.
Cristan,
25
Z jakiegoś powodu letterSpacingnie zmienia się w podglądzie AS. Musiałem faktycznie uruchomić aplikację na urządzeniu fizycznym, aby zobaczyć zmianę.
jakie są maksymalne i minimalne odstępy między literami?
Jimit Patel
26
Ta odpowiedź jest oparta na odpowiedzi Pedro, ale została dostosowana, więc działa również, jeśli atrybut tekstu jest już ustawiony:
package nl.raakict.android.spc.widget;import android.content.Context;import android.text.Spannable;import android.text.SpannableString;import android.text.style.ScaleXSpan;import android.util.AttributeSet;import android.widget.TextView;publicclassLetterSpacingTextViewextendsTextView{privatefloat letterSpacing =LetterSpacing.BIGGEST;privateCharSequence originalText ="";publicLetterSpacingTextView(Context context){super(context);}publicLetterSpacingTextView(Context context,AttributeSet attrs){super(context, attrs);
originalText =super.getText();
applyLetterSpacing();this.invalidate();}publicLetterSpacingTextView(Context context,AttributeSet attrs,int defStyle){super(context, attrs, defStyle);}publicfloat getLetterSpacing(){return letterSpacing;}publicvoid setLetterSpacing(float letterSpacing){this.letterSpacing = letterSpacing;
applyLetterSpacing();}@Overridepublicvoid setText(CharSequence text,BufferType type){
originalText = text;
applyLetterSpacing();}@OverridepublicCharSequence getText(){return originalText;}privatevoid applyLetterSpacing(){if(this==null||this.originalText ==null)return;StringBuilder builder =newStringBuilder();for(int i =0; i < originalText.length(); i++){String c =""+ originalText.charAt(i);
builder.append(c.toLowerCase());if(i+1< originalText.length()){
builder.append("\u00A0");}}SpannableString finalText =newSpannableString(builder.toString());if(builder.toString().length()>1){for(int i =1; i < builder.toString().length(); i+=2){
finalText.setSpan(newScaleXSpan((letterSpacing+1)/10), i, i+1,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);}}super.setText(finalText,BufferType.SPANNABLE);}publicclassLetterSpacing{publicfinalstaticfloat NORMAL =0;publicfinalstaticfloat NORMALBIG =(float)0.025;publicfinalstaticfloat BIG =(float)0.05;publicfinalstaticfloat BIGGEST =(float)0.2;}}
Jeśli chcesz używać go programowo:
LetterSpacingTextView textView =newLetterSpacingTextView(context);
textView.setSpacing(10);//Or any float. To reset to normal, use 0 or LetterSpacingTextView.Spacing.NORMAL
textView.setText("My text");//Add the textView in a layout, for instance:((LinearLayout) findViewById(R.id.myLinearLayout)).addView(textView);
Ponieważ Android nie obsługuje czegoś takiego, możesz to zrobić ręcznie za pomocą FontCreator. Ma dobre opcje modyfikowania czcionek. Użyłem tego narzędzia do zbudowania niestandardowej czcionki, nawet jeśli zajmuje to trochę czasu, ale zawsze możesz jej użyć w swoich projektach.
android:letterSpacing=".05"
Gdzie .05 byłoby mniej więcej „50” w programie takim jak PhotoshopOdpowiedzi:
sprawdź android: textScaleX
W zależności od potrzebnych odstępów może to pomóc. To jedyna rzecz, która jest zdalnie związana z odstępami między literami w TextView.
Edycja: zobacz odpowiedź @ JerabekJakub poniżej, aby uzyskać zaktualizowaną, lepszą metodę, aby to zrobić, zaczynając od api 21 (Lollipop)
źródło
letterSpacing
vstextScaleX
jaka ogromna różnicaOd API 21 istnieje możliwość ustawienia odstępów między literami. Możesz wywołać metodę setLetterSpacing lub ustawić ją w XML z atrybutem letterSpacing .
źródło
"1.2dp" in attribute "letterSpacing" cannot be converted to float."
letterSpacing
nie zmienia się w podglądzie AS. Musiałem faktycznie uruchomić aplikację na urządzeniu fizycznym, aby zobaczyć zmianę.Więcej przestrzeni:
Mniej miejsca:
źródło
letterSpacing
to 0,0 według developer.android.com/reference/android/widget/ ...Ta odpowiedź jest oparta na odpowiedzi Pedro, ale została dostosowana, więc działa również, jeśli atrybut tekstu jest już ustawiony:
Jeśli chcesz używać go programowo:
źródło
null
zameldowaniaapplyLetterSpacing
, ale poza tym ratuje życie!po API> = 21 istnieje metoda wbudowana dostarczana przez TextView o nazwie
setLetterSpacing
sprawdź to po więcej
źródło
Zbudowałem niestandardową klasę, która rozszerza
TextView
i rozwiązuje ten problem ... Sprawdź moją odpowiedź tutaj =)źródło
Ponieważ Android nie obsługuje czegoś takiego, możesz to zrobić ręcznie za pomocą FontCreator. Ma dobre opcje modyfikowania czcionek. Użyłem tego narzędzia do zbudowania niestandardowej czcionki, nawet jeśli zajmuje to trochę czasu, ale zawsze możesz jej użyć w swoich projektach.
źródło
Aby osadzić tekst HTML w widoku tekstu, możesz użyć
Html.fromHTML()
składni. Więcej informacji uzyskasz ze strony http://developer.android.com/reference/android/text/Html.html#fromHtml%28java.lang.String%29źródło