Android 自定义字体

Android 自定义字体

1 全局定义字体

1.准备好字体包 .ttf
2.main文件夹下新建,assets/fonts,将字体包复制到文件夹下
[外链图片转存失败(img-08arLb9f-1562135405802)(en-resource://database/617:1)]

[外链图片转存失败(img-AHUqBVFY-1562135405804)(en-resource://database/615:1)]

3.封装一个字体类,拿一个大佬写的

import android.app.Activity;
import android.content.Context;
import android.graphics.Typeface;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.lang.reflect.Field;


public class TypefaceUtil {
   /**
    * 为给定的字符串添加HTML红色标记,当使用Html.fromHtml()方式显示到TextView 的时候其将是红色的
    *
    * @param string 给定的字符串
    * @return
    */
   public static String addHtmlRedFlag(String string) {
       return "<font color=\"red\">" + string + "</font>";
   }

   /**
    * 将给定的字符串中所有给定的关键字标红
    *
    * @param sourceString 给定的字符串
    * @param keyword      给定的关键字
    * @return 返回的是带Html标签的字符串,在使用时要通过Html.fromHtml()转换为Spanned对象再传递给TextView对象
    */
   public static String keywordMadeRed(String sourceString, String keyword) {
       String result = "";
       if (sourceString != null && !"".equals(sourceString.trim())) {
           if (keyword != null && !"".equals(keyword.trim())) {
               result = sourceString.replaceAll(keyword, "<font color=\"red\">" + keyword + "</font>");
           } else {
               result = sourceString;
           }
       }
       return result;
   }

   /**
    * <p>Replace the font of specified view and it's children</p>
    * @param root The root view.
    * @param fontPath font file path relative to 'assets' directory.
    */
   public static void replaceFont(@NonNull View root, String fontPath) {
       if (root == null || TextUtils.isEmpty(fontPath)) {
           return;
       }


       if (root instanceof TextView) { // If view is TextView or it's subclass, replace it's font
           TextView textView = (TextView)root;
           int style = Typeface.NORMAL;
           if (textView.getTypeface() != null) {
               style = textView.getTypeface().getStyle();
           }
           textView.setTypeface(createTypeface(root.getContext(), fontPath), style);
       } else if (root instanceof ViewGroup) { // If view is ViewGroup, apply this method on it's child views
           ViewGroup viewGroup = (ViewGroup) root;
           for (int i = 0; i < viewGroup.getChildCount(); ++i) {
               replaceFont(viewGroup.getChildAt(i), fontPath);
           }
       }
   }

   /**
    * <p>Replace the font of specified view and it's children</p>
    * 通过递归批量替换某个View及其子View的字体改变Activity内部控件的字体(TextView,Button,EditText,CheckBox,RadioButton等)
    * @param context The view corresponding to the activity.
    * @param fontPath font file path relative to 'assets' directory.
    */
   public static void replaceFont(@NonNull Activity context, String fontPath) {
       replaceFont(getRootView(context),fontPath);
   }


   /*
    * Create a Typeface instance with your font file
    */
   public static Typeface createTypeface(Context context, String fontPath) {
       return Typeface.createFromAsset(context.getAssets(), fontPath);
   }

   /**
    * 从Activity 获取 rootView 根节点
    * @param context
    * @return 当前activity布局的根节点
    */
   public static View getRootView(Activity context)
   {
       return ((ViewGroup)context.findViewById(android.R.id.content)).getChildAt(0);
   }

   /**
    * 通过改变App的系统字体替换App内部所有控件的字体(TextView,Button,EditText,CheckBox,RadioButton等)
    * @param context
    * @param fontPath
    * 需要修改style样式为monospace:
    */
//    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
//    <!-- Customize your theme here. -->
//    <!-- Set system default typeface -->
//    <item name="android:typeface">monospace</item>
//    </style>
   public static void replaceSystemDefaultFont(@NonNull Context context, @NonNull String fontPath) {
       replaceTypefaceField("MONOSPACE", createTypeface(context, fontPath));
   }

   /**
    * <p>Replace field in class Typeface with reflection.</p>
    */
   private static void replaceTypefaceField(String fieldName, Object value) {
       try {
           Field defaultField = Typeface.class.getDeclaredField(fieldName);
           defaultField.setAccessible(true);
           defaultField.set(null, value);
       } catch (NoSuchFieldException e) {
           e.printStackTrace();
       } catch (IllegalAccessException e) {
           e.printStackTrace();
       }
   }
}

4.在appTheme 中设置一下

<!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <!-- Set system default typeface -->
        <item name="android:typeface">monospace</item>
    </style>

5.在 Application 中调用封装好的 TypeFaceUtil类

public class MyApplication extends Application {    
        @Override    
        public void onCreate() {        
        super.onCreate();        
        TypefaceUtil.replaceSystemDefaultFont(this,"fonts/my_font.ttf");    
        }
}
  1. 运行 !!!
    [外链图片转存失败(img-iD2rjvfe-1562135405804)(en-resource://database/619:1)]

2 改变单个或某一类控件

  1. 写一个类继承 TextView ,重写 setTypeface 方法
private Typeface createTypeface(Context context, String fontPath) {
        return Typeface.createFromAsset(context.getAssets(), fontPath);
    }

    @Override
    public void setTypeface(Typeface tf, int style) {
        super.setTypeface(createTypeface(getContext(),"fonts/fzzy.ttf"), style);
    }

在layout文件中使用重写的控件

<com.laundrylang.laundrylangpda.view.FontTextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="这是一个TextView"/>
  1. 给控件单独设置字体
Typeface typeface = Typeface.createFromAsset(getAssets(), "fonts/my_font.ttf");
textView.setTypeface(typeface);
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值