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

在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;
        }

    }

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

正常的图片显示

你可能感兴趣的:(Android世界)