Android 自定义字体中英文混合后导致页边距不对的解决方案

来源:互联网 发布:刺客软件 编辑:程序博客网 时间:2024/05/16 07:09

在APP中需要用到自定义的字体包,这里顺便插一下自定义字体的实现方法:

     /**     * 自定义字体     *      * @param context     * @param fontPath 字体路径     * @return     */    public static void customFont(Context context, String fontPath, TextView textView) { textView.setTypeface(Typeface.createFromAsset(context.getAssets(),"fonts/字体.ttf"));    }

步入正题,因为自定义字体与android的原生字体包兼容性不高导致当字体再TextView中显示的时候即时设置了gravity为居中,但中文字体全部偏上,具体现象见下图
忽略那小黑边,中文字体设置的是居中,但明显偏上了

英文字体正常

中英文混合后又偏上

解决方案:
既然不能用控件属性去控制页边距,那么只能通过代码手段去判断设置了,我在这里开始判断输入的字符串是否包含有中文字符,如果有则用代码去自定义控件位置,当检测到全部都是英文字母时则跳过设置,代码如下:

    /**     * 传入的str包含中文字符时设置文字的上边距,以保证文字都居中     * @param str     */    private void setChineseWordMargins(String str) {        DisplayMetrics dm = new DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);        // 由于测试机在720*1280的屏幕分辨率下距离15px刚刚居中,为了适配其他屏幕需要计算一下各个屏幕的实际距离        int actualTopMargin = 15 * dm.heightPixels / 1280;        RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) tvSpinnerTitle.getLayoutParams();        if (isChinease(str)) {            lp.topMargin = actualTopMargin;        } else {            lp.topMargin = 0;        }        tvSpinnerTitle.setLayoutParams(lp);    }    /**     * 判断字符串中是否包含中文字     *      * @param str     * @return     */    public static boolean isChinease(String str) {        String regEx = "[\\u4E00-\\u9FA5]+"; // 正则表达式        Pattern p = Pattern.compile(regEx);        Matcher m = p.matcher(str);        if (m.find()) {            return true;        } else {            return false;        }    }

这样就解决了显示问题。
正常的图片显示

正常的图片显示

0 0
原创粉丝点击