博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android给文字加边框(修改不能居中的问题)
阅读量:4057 次
发布时间:2019-05-25

本文共 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/

你可能感兴趣的文章
《软件体系结构》 第四章 软件体系结构描述
查看>>
《软件体系结构》第六章 Web服务体系结构
查看>>
《软件体系结构》 第七章 基于体系结构的软件开发
查看>>
《软件体系结构》 第九章 软件体系结构评估
查看>>
《软件体系结构》 第十章 软件产品线体系结构
查看>>
《软件过程管理》 第六章 软件过程的项目管理
查看>>
《软件过程管理》 第七章 软件过程的质量管理
查看>>
《软件过程管理》 第十章 软件过程管理实践
查看>>
《软件过程管理》 第九章 软件过程的评估和改进
查看>>
《软件过程管理》 第八章 软件过程集成管理
查看>>
分治法 动态规划法 贪心法 回溯法 小结
查看>>
《软件体系结构》 练习题
查看>>
SQL语句(一)基本表的定义
查看>>
《数据库系统概论》 第一章 绪论
查看>>
《数据库系统概论》 第二章 关系数据库
查看>>
《数据库系统概论》 第三章 关系数据库标准语言SQL
查看>>
SQL语句(二)查询语句
查看>>
SQL语句(三) 更新语句(增 删 改)
查看>>
SQL语句(四)视图定义、查询、更新和删除
查看>>
SQL语句(五) 索引建立
查看>>