android给文字加边框(修改不能居中的问题)

 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public static Bitmap drawRectf(Context context, String text) {
        String inputTxt = "输入的文字";
        inputTxt = text;
        Paint paint = new Paint();
        paint.setColor(Color.parseColor("#000000"));
        paint.setAntiAlias(true);
        ;
        paint.setTextSize(SizeUtil.sp2px(context, 17));
        Rect rect = new Rect();
        paint.getTextBounds(inputTxt, 0, inputTxt.length(), rect);
        int width = SizeUtil.dip2px(context, 150);
        int height = SizeUtil.dip2px(context, 100);
        width = rect.width();
        height = rect.height();
        //因为有边框的5个px,宽高需要加上
        width = width + 10;
        height = height + 10;
        Log.e("计算出来的宽度是", width + "");
        Bitmap bitmap = Bitmap.createBitmap(width, height,
                Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        Paint paint1 = new Paint();
        paint1.setColor(Color.parseColor("#ff0000"));
        paint1.setStrokeWidth(5);
        paint1.setAntiAlias(true);//抗锯齿
        paint1.setFilterBitmap(true);//位图过滤
        paint1.setStyle(Paint.Style.STROKE);
        //这里是起点和宽高,减去2.5是因为设置了边框宽5,如果从0,0开始则会出现圆角地方比四周边框粗,因为他实际是从-2.5开始画的,就导致看不到呢一部分
        canvas.drawRoundRect(2.5f, 2.5f, width - 2.5f, height - 2.5f, 10,10,paint1);
        //绘制非圆角的
       //canvas.drawRect(2.5f, 2.5f, width - 2.5f, height - 2.5f, paint1);
        //文字左下角的坐标,这里会发现某些文字会出现紧贴这底部边框,出现的原因是下面的参数xy的y表示的是横向的基准线,他只是基准线并不是底线。类似于英语书写的四线格
        canvas.drawText(inputTxt, 5f, height - 5f, paint);
        return bitmap;
    }

增:上面的代码是不能实现文字的中心正好是框的中心,出现的原因就是基准线的问题,基准线并不是文字在纵向上的中线,所以需要计算下:height/2就是我们需要显示样式中文字纵向的中线

//为了让文字纵向居中,计算正确的Y值
        Paint.FontMetrics fontMetrics = paint.getFontMetrics();
        //ascent的绝对值=descent+2*(文字纵向中线与基准线的高度差)
        //float baseline = 0;
       //Math.abs(fontMetrics.ascent) =fontMetrics.descent+2*(baseline-height/2);
        float y = height / 2 + (Math.abs(fontMetrics.ascent) - fontMetrics.descent) / 2;
        canvas.drawText(text, 5f, y, paint);

 

工具类:

public class SizeUtil {
    /**
     * 根据手机分辨率从DP转成PX
     * @param context
     * @param dpValue
     * @return
     */
    public static int dip2px(Context context, float dpValue) {
        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    /**
     * 将sp值转换为px值,保证文字大小不变
     * @param spValue
     * @return
     */
    public static int sp2px(Context context, float spValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue * fontScale + 0.5f);
    }

    /**
     * 根据手机的分辨率PX(像素)转成DP
     * @param context
     * @param pxValue
     * @return
     */
    public static int px2dip(Context context, float pxValue) {
        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

    /**
     * 将px值转换为sp值,保证文字大小不变
     * @param pxValue
     * @return
     */

    public static int px2sp(Context context, float pxValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (pxValue / fontScale + 0.5f);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值