博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 绘制字符串到自定义view的中心
阅读量:5993 次
发布时间:2019-06-20

本文共 3025 字,大约阅读时间需要 10 分钟。

hot3.png

        处理字符串的长度和宽度,并没有想象中的那么简单,要讲字符串画到自定义view的中心点,更加没有那么简单!

1. 计算字符串的长度

        介绍两种计算方法,但是结果却很意外哦!

        (1)最小外接矩形      

 

paint.setTextSize(textSize);

paint.setTypeface(Typeface.MONOSPACE);
Rect r = new Rect();
paint.getTextBounds(text,0,text.length(),r);
int height = r.bottom - r.top;
int width = r.right - r.left;

        (2)使用FontMetrics

Paint.FontMetrics fm = paint.getFontMetrics();float textWidth = paint.measureText(text);float textHeight = fm.bottom - fm.top;

        说明:这两种方法计算方法结果会有很大的出入,原因是什么呢?据我猜测啊...第一种方法是计算字符串所占的最小大小,也就是包围字符串的最小外接矩形(可以算出字符串的实际长度和宽度);而第二种则是老外针对他们的字母的计算,看看字母a,b,j这些要怎么计算它的高度?难道a,b,j都要有一个计算其高度的算法?不可能啊,显示出来也不美观,最起码得按字母j计算,补上a和b缺少的部分,让所有的字母都是一个高度,老外就想了个辙,把字母的整个高度分成好几个部分(想想小学写拼音的),你想要什么自己处理去,比如:descent,ascent,top,bottom以及leading,这些东西都封装在FontMetrics类里面。下面是两种种算法的示意图。

111013_pfXx_1257439.png

111014_AlC7_1257439.png

2. 自定义view

        自定义一个圆圈

Circle View {    private String text            = "帅";    private int textColor          = Color.BLACK;    private int textSize           = 0;    private PointF center          = new PointF(0.0f, 0.0f);    private float strokeWidth      = 0.0f;    private float radius           = 0.0f;    private int fillColor          = Color.RED;    private int strokeColor        = Color.GREEN;    private Paint paint;    public Circle(Context context) {        this(context, null);    }    public Circle(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public Circle(Context context, AttributeSet attrs, defStyleAttr) {        super(context, attrs, defStyleAttr);        TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.Circle);        int count = ta.getIndexCount();        for(int i=0; i
<= 0) {            return;        }            float cx = center.x + radius;        float cy = center.y + radius;        //fill        paint.setColor(fillColor);        paint.setStyle(Paint.Style.FILL);        canvas.drawCircle(cx, cy, radius, paint);        //text        if(!text.isEmpty()&& textSize>0) {            paint.setColor(textColor);            paint.setTextSize(textSize);            paint.setTypeface(Typeface.MONOSPACE);            Rect r = new Rect();            paint.getTextBounds(text,0,text.length(),r);            int height = r.bottom - r.top;            int width = r.right - r.left;            Paint.FontMetrics fm = paint.getFontMetrics();            float textWidth = paint.measureText(text);            float textHeight = fm.bottom - fm.top;            float offsetX = width / 2;            float offsetY = height/2 - (fm.bottom - (textHeight - height)/2);            canvas.drawText(text, cx-offsetX, cx+offsetY, paint);        }        //stroke        if(strokeWidth > 0) {            paint.setColor(strokeColor);            paint.setStrokeWidth(strokeWidth);            paint.setStyle(Paint.Style.STROKE);            canvas.drawCircle(cx, cy, radius, paint);        }    }

        上面只是部分代码,看看onDraw方法就可以了。可见我上面画了一个圆圈并描边了,并且在圆圈里面画了一个字符串,让字中心居于圆心。在让字居于圆心,可是走了一段路,请看下面图解(看看上面代码offsetY的得到)。

114956_rBIP_1257439.png

        从上图可以清晰的看出,y方向应该偏移的量:offsetY = h2/2-(bh-(h1-h2)/2)。

3. 效果

115307_akI1_1257439.png

转载于:https://my.oschina.net/u/1257439/blog/521153

你可能感兴趣的文章
android ndk makefile 文件记录
查看>>
angularjs $routeProvider template 函数及参数解惑
查看>>
Oracle 11g R2 常见问题处理
查看>>
aliyun_api_cmd.py——在命令行调用阿里云API
查看>>
Centos下***(pptpd)的部署
查看>>
操作无法完成。键入的打印机名不正确,或者指定的打印机没有连接到服务器上的解决办法!...
查看>>
struts2的restful
查看>>
Java基础加强-代理
查看>>
linux系统中实现多网卡的绑定
查看>>
6.Java集合-LinkedList实现原理及源码分析
查看>>
SP2与R2的区别之处
查看>>
Notifyall学习笔记
查看>>
The Journey Of Success
查看>>
java调用cmd命令
查看>>
redis+spring
查看>>
【转】hibernate.hbm.xml详解
查看>>
POJ-2159(Water)
查看>>
python学习之-影像和集合类型
查看>>
mongodb的安装/配置(文件)/启动 问题
查看>>
saltstack安装
查看>>