本文共 3164 字,大约阅读时间需要 10 分钟。
@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); }}
转载地址:http://jcrci.baihongyu.com/