Установка пользовательского шрифта для TextView, в результате чего onCreate занимает больше времени для сборки

В настоящее время я внедряю шрифт Roboto в свой проект. Для некоторых фрагментов существует множество TextView. Я создаю пользовательский вид, который расширяет TextView для реализации пользовательских шрифтов. Есть ли лучший способ загрузить шрифты без увеличения времени onCreate?

Расширяет TextView

public class TextViewFont extends TextView {

    public TextViewFont(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(attrs);
    }

    public TextViewFont(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(attrs);

    }

    public TextViewFont(Context context) {
        super(context);
        init(null);
    }

    private void init(AttributeSet attrs) {
        if (attrs != null) {
            TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.TextViewFont);
            String fontName = a.getString(R.styleable.TextViewFont_fontName);
            if (fontName != null) {
                Typeface myTypeface = Typeface.createFromAsset(getContext().getAssets(), "fonts/" + fontName);
                setTypeface(myTypeface);
            }
            a.recycle();
        }
    }
}

XML

<com.eugene.fithealthmaingit.Custom.TextViewFont
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:layout_weight="1"
            android:text="@string/dinner"
            android:textColor="@color/text_color"
            android:textSize="16sp"
            app:fontName="Roboto-Regular.ttf"/>

Пример того, сколько TextView's

3 ответа

Решение

Typeface.createfromassets - это процесс, требующий времени. Вы должны объявить гарнитуру как статическую переменную в классе и просто использовать ее в конструкторе.

Но здесь вы загружаете шрифты в конструктор каждого текстового представления.

Если у вас несколько шрифтов, используйте все типы шрифтов как статические и используйте их соответствующим образом.

ОБНОВЛЕНИЕ КОДА:

public class TextViewFont extends TextView {

        public static Typeface typeface1 = Typeface.createFromAsset(getContext().getAssets(), "fonts/fontName1");
        public static Typeface typeface2 = Typeface.createFromAsset(getContext().getAssets(), "fonts/fontName2");
        public static Typeface typeface3 = Typeface.createFromAsset(getContext().getAssets(), "fonts/fontName3");
        public static Typeface typeface4 = Typeface.createFromAsset(getContext().getAssets(), "fonts/fontName4");
        public static Typeface typeface5 = Typeface.createFromAsset(getContext().getAssets(), "fonts/fontName5");

        public TextViewFont(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            init(attrs);
        }

        public TextViewFont(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(attrs);

        }

        public TextViewFont(Context context) {
            super(context);
            init(null);
        }

        private void init(AttributeSet attrs) {
            if (attrs != null) {
                TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.TextViewFont);
                String fontName = a.getString(R.styleable.TextViewFont_fontName);
                if (fontName != null) {
                    setTypeface(getTypeFace(fontName));
                }
                a.recycle();
            }
        }


        public Typeface getTypeFace(String fontName){
            if(fontName.equals("fontName1")){
                return typeface1;
            }else if(fontName.equals("fontName2")){
                return typeface2;
            }else if(fontName.equals("fontName3")){
                return typeface3;
            }else if(fontName.equals("fontName4")){
                return typeface4;
            }else if(fontName.equals("fontName5")){
                return typeface5;
            }
        }
    } 
}

Это библиотека, которая спасла мою жизнь каллиграфии. Это действительно приятно и просто в использовании.

Попробуйте использовать экземпляр singleton или applicationingleton. Посмотри, работает ли это. Поэтому вы можете просто вызвать TextLover.get(context).getFont(id). Он будет создавать и кэшировать его на лету. Таким образом, ваши другие представления также могут повторно использовать кэш шрифтов. например. кнопки

class TextLover {

    private static TextLover singleton;

    private final Context context;

    private final SparseArray<Typeface> faces = new SparseArray<Typeface>();

    public TextLover get(Context context) {
        if (singleton == null) {
            singleton = new TextLover(context);
        }
        return singleton;
    }

    private TextLover(Context context) {
        this.context = context;
    }

    private static final String[] fonts = {
        "fonts/fontName1",
        "fonts/fontName2",
        "fonts/fontName3",
        "fonts/fontName4",
        "fonts/fontName5",
            ...
        "fonts/fontName100"
    }

    // NOTE you need a mapping of ids to each asset font in fonts[]

    public Typeface getFont(int id) {
        Typeface font = faces.get(id);
        if (font == null) {
            font = Typeface.createFromAsset(context.getAssets(), fonts[id]);
            faces.append(id, font);
        }
        return font;
    }

}
Другие вопросы по тегам