Fontawesome 5 в Android, 3 файла - PullRequest
0 голосов
/ 29 мая 2018

В течение некоторого времени я использовал fontawesome-webfont.ttf, но теперь уже довольно давно вышел FontAwesome 5, и я не могу понять, как его использовать.Из того, что я понимаю, они разделили этот файл на несколько файлов.Теперь у вас есть 3 файла: обычный, солидный, фирменный.То, что я пытаюсь сделать, это объединить все 3 из них, или что правильный файл используется для правильного значка, потому что в Android у меня есть FontManager, который обрабатывает шрифты из 1 файла ttf, а затем у меня есть собственные текстовые представления икласс кнопок, которые получают шрифты от этого менеджера, поэтому мне не нужно устанавливать их в действиях или фрагментах.

object FontManager {

    val ROOT = "fonts/"
    val FONTAWESOME = ROOT + "fontawesome-webfont.ttf"

    fun getTypeface(context: Context, font: String): Typeface {
        return Typeface.createFromAsset(context.assets, font)
    }

    fun markAsIconContainer(v: View, typeface: Typeface) {
        if (v is ViewGroup) {
            for (i in 0 until v.childCount) {
                val child = v.getChildAt(i)
                markAsIconContainer(child, typeface)
            }
        } else if (v is TextView) {
            v.typeface = typeface
        }
    }

}

Пример TextViewWithFont:

class TextViewFont : android.support.v7.widget.AppCompatTextView {

    constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {
        init(context)
    }

    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
        init(context)
    }

    constructor(context: Context) : super(context) {
        init(context)
    }

    private fun init(context: Context) {
        val iconFont = FontManager.getTypeface(context, FontManager.FONTAWESOME)
        FontManager.markAsIconContainer(this, iconFont)
    }
}

Как вы можете видеть, чтоFONTAWESOME, получает файл ttf, а затем управляет им.Есть ли способ объединить все 3 файла ttf, чтобы я мог использовать все значки, которые предоставляет FontAwesome.Трудный путь заключается в том, что я использую обычный текстовый вид и для каждого значка соответствующий ресурс (сплошной / бренд / обычный).Как мне объединить их в Android?

1 Ответ

0 голосов
/ 30 мая 2018

В настоящее время большинство шрифтов имеют такие же вариации, как у вас.Таким образом, вы можете конвертировать ваш менеджер шрифтов для обработки нескольких файлов, как показано ниже.

FontManager - FontCache.class

public class FontCache {


private static String[] fonts = {"ProximaNova-Reg.otf","ProximaNova-Light.otf","ProximaNova-Medium.otf","ProximaNova-Sbold.otf","ProximaNova-Bold.otf","ProximaNova-Light-It.otf","ProximaNova-Medium-It.otf"};
private static HashMap<String, Typeface> fontCache = new HashMap<>();

public static Typeface getTypeface(int fontPos, Context context) {
    String font = "fonts/"+fonts[fontPos];
    Typeface typeface = fontCache.get(font);

    if (typeface == null) {
        try {
            typeface = Typeface.createFromAsset(context.getAssets(), font);
        } catch (Exception e) {
            return null;
        }

        fontCache.put(font, typeface);
    }

    return typeface;
  }
}

И ваш класс CustomTextView

public class CustomTextView extends TextView {

    public CustomTextView(Context context) {
        super(context);
    }

    public CustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        applyCustomFont(context, attrs);
    }

    public CustomTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        applyCustomFont(context, attrs);
    }

    private void applyCustomFont(Context context,AttributeSet attrs) {
        int fontPos = getFont(context,attrs);
        Typeface customFont = FontCache.getTypeface(fontPos, context);
        setTypeface(customFont);
    }

    private int getFont(Context ctx, AttributeSet attrs){
        TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.CustomTextView);
        int customFont = a.getInt(R.styleable.CustomTextView_customFont,0);
        return customFont;
    }
}

создает атрибуты.XML-файл в папке res / values.Этот файл содержит варианты шрифта.Вы можете указать любое количество шрифтов, которое вам нужно.

res / values ​​/ attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CustomTextView">
        <attr name="customFont">
            <enum name="regular" value="0" />
            <enum name="light" value="1" />
            <enum name="medium" value="2" />
            <enum name="semibold" value="3" />
            <enum name="bold" value="4" />
            <enum name="light_it" value="5" />
            <enum name="medium_it" value="6" />
        </attr>
    </declare-styleable>
</resources>

Текстовое представление внутри макета

 <com.t365.android.customview.CustomTextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="test"
                app:customFont="semibold" // semibold variantion of your font is applied here // if nothing is specified here it takes base variant of your custom font
                />

Если вы не укажете какой-либо шрифт, он будет использовать базовый вариант вашего шрифта (скажем, обычный в вашем Fontawesome, как упомянуто в вопросе), который мы сделали в классе CustomTextview.

private int getFont(Context ctx, AttributeSet attrs){
        TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.CustomTextView);
        int customFont = a.getInt(R.styleable.CustomTextView_customFont,0); // by default we are asking fontManger to take 0 variant.
        return customFont;
    }
...