Nie znalazłem sposobu, aby to zrobić. Czy to możliwe?Jak mogę użyć TypefaceSpan lub StyleSpan z niestandardową czcionką?
Odpowiedz
Cóż, nie mogłem wymyślić, jak to zrobić z dostępnymi klasami, więc rozszerzyłem TypefaceSpan
na własną rękę i teraz działa dla mnie. Oto co zrobiłem:
package de.myproject.text.style;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.text.TextPaint;
import android.text.style.TypefaceSpan;
public class CustomTypefaceSpan extends TypefaceSpan {
private final Typeface newType;
public CustomTypefaceSpan(String family, Typeface type) {
super(family);
newType = type;
}
@Override
public void updateDrawState(TextPaint ds) {
applyCustomTypeFace(ds, newType);
}
@Override
public void updateMeasureState(TextPaint paint) {
applyCustomTypeFace(paint, newType);
}
private static void applyCustomTypeFace(Paint paint, Typeface tf) {
int oldStyle;
Typeface old = paint.getTypeface();
if (old == null) {
oldStyle = 0;
} else {
oldStyle = old.getStyle();
}
int fake = oldStyle & ~tf.getStyle();
if ((fake & Typeface.BOLD) != 0) {
paint.setFakeBoldText(true);
}
if ((fake & Typeface.ITALIC) != 0) {
paint.setTextSkewX(-0.25f);
}
paint.setTypeface(tf);
}
}
Podczas notme ma zasadniczo prawo pomysł, rozwiązanie podane jest nieco hacky jako „rodzina” staje się zbędna. Jest również nieco niepoprawny, ponieważ TypefaceSpan jest jednym ze specjalnych zakresów, o których wie Android, i oczekuje pewnych zachowań w odniesieniu do interfejsu ParcelableSpan (którego podklasa notmy nie jest właściwa, ani nie jest możliwa do wdrożenia).
Prostsza i bardziej precyzyjne rozwiązanie byłoby:
public class CustomTypefaceSpan extends MetricAffectingSpan
{
private final Typeface typeface;
public CustomTypefaceSpan(final Typeface typeface)
{
this.typeface = typeface;
}
@Override
public void updateDrawState(final TextPaint drawState)
{
apply(drawState);
}
@Override
public void updateMeasureState(final TextPaint paint)
{
apply(paint);
}
private void apply(final Paint paint)
{
final Typeface oldTypeface = paint.getTypeface();
final int oldStyle = oldTypeface != null ? oldTypeface.getStyle() : 0;
final int fakeStyle = oldStyle & ~typeface.getStyle();
if ((fakeStyle & Typeface.BOLD) != 0)
{
paint.setFakeBoldText(true);
}
if ((fakeStyle & Typeface.ITALIC) != 0)
{
paint.setTextSkewX(-0.25f);
}
paint.setTypeface(typeface);
}
}
+1 Dziękuję! A [tutaj] (http://stackoverflow.com/a/10741161/89818) jest prawidłowym przykładem użycia. – caw
@MarcoW i @Benjamin .... Benjamin mówi, że nie można używać "TypefaceSpan", ale Marco pokazuje przykład pracy, używając właśnie tego. Który jest właściwy? Benjamin, czy przetestowałeś swój przykład? –
@JaysonMinard Myślę, że @MarcoW skomentował złą odpowiedź. Przypuszczam, że chciał skomentować odpowiedź @ notme, ponieważ użył jej w swojej klasie. Aby było jasne, nie mówię, że * nie można * podklasy 'TypefaceSpan'. Po prostu bardzo mocno sugeruję, że nie powinieneś tego robić. Takie postępowanie przełamuje zasadę podstawiania Liscova i jest wyjątkowo złą praktyką. Podklasowałeś klasę, która określa czcionkę poprzez "rodzinną" nazwę * i * jest działka; w ten sposób całkowicie nadpisałeś to zachowanie i sprawiłeś, że parametr "family" był mylący i bezcelowy, a 'Span' również * nie * jest paczkowany. –
Próbowałem kilka podobnych rozwiązań, okazało się, że This jest proste i wykonalne. Wystarczy kliknąć element jest uchwyt jako kliknięcie przycisku zamiast onOptionsItemSelected. Dzięki!
Oto mój kod dla mojego projektu:
W moim menu_main.xml:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<item
android:id="@+id/action_friends"
android:orderInCategory="100"
android:title="@string/hello_world"
app:actionViewClass="android.widget.Button"
app:showAsAction="always" />
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:title="@string/action_settings"
app:showAsAction="never" />
</menu>
In My MainActivity.java:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Use custom menu
MenuInflater inflater = getMenuInflater();
//Inflate the custom menu
inflater.inflate(R.menu.menu_main, menu);
//reference to the item of the menu
MenuItem i=menu.findItem(R.id.action_friends);
Button itemuser =(Button) i.getActionView();
if(itemuser!=null){
// Create Typeface object to use unicode font in assets folder
Typeface a = Typeface.createFromAsset(getApplicationContext(), "fontawesome-webfont.ttf");
// Set unicode font to menu item
itemuser.setTypeface(a);
itemuser.setText(getString(R.string.fa_users));
// Set item text and color
itemuser.setTextColor(Color.BLACK);
// Make item background transparent
itemuser.setBackgroundColor(Color.TRANSPARENT);
itemuser.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
//set action when clicked
}
});
}
return super.onCreateOptionsMenu(menu);
}
- 1. Problemy z wypełnieniem (?) Z niestandardową czcionką ikony. Przykład poniżej:
- 2. Jak zmienić czcionkę czcionką?
- 3. Zestaw ActionBar z niesamowitą czcionką
- 4. Gradient tekstu z czcionką niesamowitą
- 5. Aby porównać UUID, czy mogę użyć == lub użyć UUID.equals (UUID)?
- 6. Debugowanie problemów z czcionką PhantomJS @
- 7. Jak mogę użyć FSharp.Data z VS 2015?
- 8. Jak mogę użyć sbt.IO?
- 9. Jak mogę użyć HTML 5?
- 10. Jak wykryć znaki zdefiniowane czcionką?
- 11. Jak mogę użyć getimagesize() z $ _FILES ['']?
- 12. Jak mogę użyć ActiveJob z Rails 4.1?
- 13. Jak mogę użyć xaxis_date() z barh()?
- 14. Jak mogę użyć Debug.Write z danymi dynamicznymi?
- 15. Jak mogę łączyć funkcję niestandardową po opóźnieniu?
- 16. jak odwzorować niestandardową tabelę za pomocą ActiveRecord lub czy powinienem użyć innej ORM?
- 17. Wyświetlane problemy z czcionką nagłówka NSOutlineView
- 18. Jak mogę znaleźć wszystkie fasolki z niestandardową adnotacją @Foo?
- 19. Czy mogę użyć wielu "z"?
- 20. Markdown z niestandardową składnią?
- 21. Jak mogę użyć SUM() OVER()
- 22. Jak mogę użyć selektora "nie"?
- 23. Jak mogę użyć GDB "obejrzyj"?
- 24. Jak mogę wielokrotnie użyć bloku?
- 25. Google Webfont konflikt z lokalną czcionką
- 26. iterator wyjścia C++ z wymazaną czcionką
- 27. Jak stylów CSS wyboru czcionką Niesamowite
- 28. Problem z czcionką Safari, tekst za gruby
- 29. Sposób ustawiania czcionek niestandardowych pogrubioną czcionką
- 30. Jak mogę użyć niestandardowych czcionek w witrynie internetowej?
Jakoś to nie będzie działać na guziki. Jakieś pomysły, dlaczego? – mikepenz
@ notme co należy przekazać do rodziny zmiennych łańcuchowych w tym konstruktorze CustomTypefaceSpan (rodzina ciągów, typ kroju pisma) {} ??? – KJEjava48