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

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

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

2、提供字体内存高效

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

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的所有功能和属性;但添加我们的自定义字体。

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代码!

<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 条评论
登录 后参与评论

相关文章

来自专栏郭霖

Android Scroller完全解析,关于Scroller你所需知道的一切

2016大家新年好!这是今年的第一篇文章,那么应CSDN工作人员的建议,为了能给大家带来更好的阅读体验,我也是将博客换成了宽屏版。另外,作为一个对新鲜事物从来后...

2706
来自专栏上善若水

035android初级篇之[转]android的ViewGroup与View

Android中的View包含了用户交互和显示,类似于Windows操作系统中的window。

1023
来自专栏程序员叨叨叨

Android大坑集锦

这些方法有的可以,有的不行,或许跟版本有关,或许Android本身不是很支持用setImageUri从网上获取图片吧!与其煞费苦心让这个方法有效,不如用Imag...

844
来自专栏青玉伏案

Android开发之自定义组件和接口回调

说到自定义控件不得不提的就是接口回调,在Android开发中接口回调用的还是蛮多的。在这篇博客开始的时候呢,我想聊一下iOS的自定义控件。在iOS中自定义控件的...

22910
来自专栏Android Note

Android上的自定义字体 - 通过XML进行动态字体选择

1316
来自专栏AndroidTv

View 动画 Animation 运行原理解析

这次想来梳理一下 View 动画也就是补间动画(ScaleAnimation, AlphaAnimation, TranslationAnimation...)...

3975
来自专栏郭霖

Android ActionBar完全解析,使用官方推荐的最佳导航栏(下)

本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文。 限于篇幅的原因,在上篇文章中我们只学习了ActionBa...

2708
来自专栏AndroidTv

AndroidTv Home界面实现原理(二)——Leanback 库的主页卡位缩放动画源码解析

上一篇中,我们留了问题,在 Tv Home 界面这种很常见聚焦卡位放大动画效果,我们这一篇就来看看 Leanback 库是怎么实现的。

4156
来自专栏Android开发小工

完全自定义样式的一句话实现RecyclerView的单选多选

今天的主题是封装RecyclerView的单选多选,现在大家应该都是用的RecyclerView开发列表数据吧。

2015
来自专栏Android开发指南

10.多媒体

4038

扫码关注云+社区

领取腾讯云代金券