Android上的自定义字体 - 扩展TextView

2018-07-02 11:20:04 浏览数 (1)

1、将自定义字体应用于所有TextView

应用中我们会经常用到自定义字体的TextView。我们需要每次都去设置TextView的字体。但是,如果您在整个应用程序中多次使用它,那么效率低下(多次分配fontface)和代码(重复相同的代码)是无效的。

2、提供字体内存高效

Android手机内存低的时候已经结束了,但是我们还是应该优化效率。因此,我们应该缓存我们的自定义字体。来自britzl的stackoverflow( britzl on stackoverflow )的解决方案,并调整了一点写法:

代码语言:javascript复制
public class FontCache {
    private static HashMap<String, Typeface> fontCache = new HashMap<>();
    public static Typeface getTypeface(String fontname, Context context) {
        Typeface typeface = fontCache.get(fontname);
        if (typeface == null) {
            try {
                typeface = Typeface.createFromAsset(context.getAssets(), fontname);
            } catch (Exception e) {
                return null;
            }
            fontCache.put(fontname, typeface);
        }
        return typeface;
    }
}

这将缓存字体,同时最小化对assets文件夹的访问次数。现在,由于我们有一种访问我们的自定义字体的方法,我们来实现一个扩展TextView的类。

3、扩展TextView

接下来,我们将创建一个新的Java类,它扩展了TextView。这允许我们在所有XML视图中使用该类。它继承了常规TextView的所有功能和属性;但添加我们的自定义字体。

代码语言:javascript复制
public class CustomTextView extends TextView {

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

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

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

    private void applyCustomFont(Context context) {
        Typeface customFont = FontCache.getTypeface("SourceSansPro-Regular.ttf", context);
        setTypeface(customFont);
    }
}

它从我们的FontCache类获得(希望缓存)字体。最后,我们必须使用字体调用setTypeface()。

4、使用类

只需在XML视图中使用该类,它会自动使用您的自定义字体。没有必要的Java代码!

代码语言:javascript复制
<RelativeLayout  
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.custom.views.CustomTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/green_dark"
        android:textSize="20sp"
        android:text="Android Studio"
        />

</RelativeLayout>  

您可以看到,您可以继续使用TextView的所有细节(例如textSize,textColor)。现在,只需使用我们刚刚创建的类替换所有<TextView />元素,例如<com.custom.views.CustomTextView />,并且您随时应用自定义字体! 好了,自定义字体的TextView到这里就结束了。

0 人点赞