FontManager 给某个页面或某些控件更改字体

来源:互联网 发布:知乎日报 正装 编辑:程序博客网 时间:2024/06/05 17:33
更改字体的方法:
public class FontsManager {    public static final String TAG = "FontsManagerException";    public static final String INIT_EXCEPTION = "FontsManager使用该函数前必须先进行初始化";    /** 默认字体 */    public static Typeface defaultTypeface = null;    private FontsManager(){}    //----初始化-------------------------------------------------------------------------    /**     * 初始化     *     * @Title: init     * @param typeface 字体     */    public static void init(Typeface typeface){        if (typeface == null) {            Log.e(TAG, "typeface不能为空。");            throw new IllegalStateException("typeface不能为空。");        } else {            defaultTypeface = typeface;        }    }    /**     * 初始化     *     * @Title: initFormAssets     * @param context 上下文     * @param fontPath Assets中字体包路径     */    public static void initFormAssets(Context context, String fontPath){        try {            defaultTypeface = Typeface.createFromAsset(context.getAssets(), fontPath);        } catch (Exception e) {            Log.e(TAG, "初始化失败,请检查fontsPath是否错误");            throw new IllegalStateException("初始化失败,请检查fontsPath是否错误");        }    }    /**     * 初始化     *     * @Title: initFormFile     * @param fontPath 字体包存放路径(例如:sdcard/font.ttf)     */    public static void initFormFile(String fontPath){        try {            defaultTypeface = Typeface.createFromFile(fontPath);        } catch (Exception e) {            Log.e(TAG, "初始化失败,请检查fontsPath是否错误");            throw new IllegalStateException("初始化失败,请检查fontsPath是否错误");        }    }    /**     * 初始化     *     * @Title: initFormFile     * @param fontPath 字体包文件     */    public static void initFormFile(File fontFile){        try {            defaultTypeface = Typeface.createFromFile(fontFile);        } catch (Exception e) {            Log.e(TAG, "初始化失败,请检查fontFile是否是字体文件");            throw new IllegalStateException("初始化失败,请检查fontFile是否是字体文件");        }    }    //----改变字体-------------------------------------------------------------------------    /**     * 更换字体     *     * @Title: changeFonts     * @param activity     */    public static void changeFonts(Activity activity){        if (defaultTypeface == null) {            Log.e(TAG, INIT_EXCEPTION);            throw new IllegalStateException(INIT_EXCEPTION);        }        //此行代码注释后不看到有什么变化//        ActionBarHelper.changeTitleFonts(activity, defaultTypeface);        changeFonts((ViewGroup) activity.findViewById(android.R.id.content), defaultTypeface);    }    /**     * 更改字体     *     * @Title: changeFonts     * @param view     */    public static void changeFonts(View view){        if (defaultTypeface == null) {            Log.e(TAG, INIT_EXCEPTION);            throw new IllegalStateException(INIT_EXCEPTION);        }        changeFonts(view, defaultTypeface);    }    /**     * 更改字体     *     * @Title: changeFonts     * @param viewGroup     */    public static void changeFonts(ViewGroup viewGroup){        if (defaultTypeface == null) {            Log.e(TAG, INIT_EXCEPTION);            throw new IllegalStateException(INIT_EXCEPTION);        }        changeFonts(viewGroup, defaultTypeface);    }    /**     * 更换字体     *     * @Title: changeFonts     * @param viewGroup     * @param typeface     */    public static void changeFonts(ViewGroup viewGroup, Typeface typeface){        try {            for (int i = 0; i < viewGroup.getChildCount(); i++) {                View v = viewGroup.getChildAt(i);                if (v instanceof ViewGroup) {                    changeFonts((ViewGroup) v, typeface);                } else if (v instanceof View) {                    changeFonts((View) v, typeface);                }            }        } catch (Exception e) {            Log.e(TAG, e.toString());            // TODO        }    }    /**     * 更换字体     *     * @Title: changeFonts     * @param view     * @param typeface void     */    public static void changeFonts(View view, Typeface typeface){        try {            if (view instanceof ViewGroup) {                changeFonts((ViewGroup) view, typeface);            } else if (view instanceof TextView) {                ((TextView) view).setTypeface(typeface);            } else if (view instanceof Button) {                ((Button) view).setTypeface(typeface);            } else if (view instanceof Switch) {                ((Switch) view).setTypeface(typeface);            } else if (view instanceof EditText) {                ((EditText) view).setTypeface(typeface);            }        } catch (Exception e) {            Log.e(TAG, e.toString());            // TODO        }    }}
View页,点击按钮更改字体,字体放在与java目录平级的assets目录下:
public class FontManageDemoActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_font_manage_demo);        FontsManager.initFormAssets(FontManageDemoActivity.this,"fonts/sao.ttf");        Button button = (Button) findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                FontsManager.changeFonts(FontManageDemoActivity.this);                Toast.makeText(FontManageDemoActivity.this,"替换成功",Toast.LENGTH_SHORT).show();            }        });    }}

在网上查询到的资料中还有一个文件,但我使用后,没看到效果,该文件的调用在FontManager.java中的changeFonts(Activity activity)中:
@SuppressLint("DefaultLocale")@SuppressWarnings("deprecation")public class ActionBarHelper {    private static final String TAG = "ActionBarHelper";    public static final String INIT_EXCEPTION = "使用该函数前必须对FontsManager进行初始化";    /**     * 改变标题字体     *     * @Title: changeTitleFonts     * @param activity     * @param typeface     */    @TargetApi(Build.VERSION_CODES.HONEYCOMB)    public static void changeTitleFonts(Activity activity, Typeface typeface){        if (typeface == null || activity == null) {            Log.e(TAG, "activity或 typeface等于空!");            return;        }        if (activity instanceof ActionBarActivity) {            try {                android.support.v7.app.ActionBar actionBar = ((ActionBarActivity) activity).getSupportActionBar();                setTitle(actionBar, typeface, actionBar.getTitle().toString());            } catch (Exception e) {                Log.e(TAG, e.toString());            }        } else if (activity instanceof Activity) {            try {                ActionBar actionBar = activity.getActionBar();                setTitle(actionBar, typeface, actionBar.getTitle().toString());            } catch (Exception e) {                Log.e(TAG, e.toString());            }        }    }    @TargetApi(Build.VERSION_CODES.HONEYCOMB)    public static void setTitle(Activity activity, Typeface typeface, String title){        if (activity instanceof android.support.v7.app.ActionBarActivity) {            try {                android.support.v7.app.ActionBar actionBar = ((ActionBarActivity) activity).getSupportActionBar();                setTitle(actionBar, typeface, title);            } catch (Exception e) {                Log.e(TAG, e.toString());            }        } else if (activity instanceof Activity) {            try {                ActionBar actionBar = activity.getActionBar();                setTitle(actionBar, typeface, title);            } catch (Exception e) {                Log.e(TAG, e.toString());            }        }    }    public static void setTitle(android.support.v7.app.ActionBar actionBar, Typeface typeface, String title){        if (typeface == null || actionBar == null) {            Log.e(TAG, "typeface或actionbar为空");            return;        }        SpannableString sp = new SpannableString(title);        sp.setSpan(new TypefaceSpan(typeface), 0, sp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);        setTitle(actionBar, sp);    }    public static void setTitle(ActionBar actionBar, Typeface typeface, String title){        if (typeface == null || actionBar == null) {            Log.e(TAG, "typeface或actionbar为空");            return;        }        SpannableString sp = new SpannableString(title);        sp.setSpan(new TypefaceSpan(typeface), 0, sp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);        setTitle(actionBar, sp);    }    /**     * 设置标题     *     * @Title: setTitle     * @param actionBar     * @param spannableString     */    public static void setTitle(android.support.v7.app.ActionBar actionBar, SpannableString spannableString){        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN && Build.MANUFACTURER.toUpperCase().equals("LGE")) {            actionBar.setTitle(spannableString.toString());        } else {            actionBar.setTitle(spannableString);        }    }    /**     * 设置标题     *     * @Title: setTitle     * @param actionBar     * @param spannableString     */    @TargetApi(11)    public static void setTitle(ActionBar actionBar, SpannableString spannableString){        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN && Build.MANUFACTURER.toUpperCase().equals("LGE")) {            actionBar.setTitle(spannableString.toString());        } else {            actionBar.setTitle(spannableString);        }    }    /**     * 设置字体样式     *     * @ClassName: TypefaceSpan     * @author: sloop     * @website: http://www.sloop.icoc.cc     * @weibo: http://weibo.com/u/5459430586     * @date 2015年6月9日 下午12:11:13     */    private static class TypefaceSpan extends MetricAffectingSpan {        Typeface typeface;        TypefaceSpan(Typeface typeface){            this.typeface = typeface;        }        @Override        public void updateMeasureState(TextPaint p){            p.setTypeface(typeface);            p.setFlags(p.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);        }        @Override        public void updateDrawState(TextPaint tp){            tp.setTypeface(typeface);            tp.setFlags(tp.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);        }    }}

0 0
原创粉丝点击