Android自定义控件

Canvas画布

平移:

 * 参数1: 向X轴方向移动100距离

 * 参数2: 向Y轴方向移动50距离   

 */

 canvas.translate(100, 50);

 

缩放:

/**

 * 在X轴方向放大为原来2倍,Y轴方向方大为原来的4倍

 * 参数1: X轴的放大倍数

 * 参数2: Y轴的放大倍数

 */

canvas.scale(2, 4);

/**

 * 在X轴方向放大为原来2倍,Y轴方向方大为原来的4倍

 * 参数1: X轴的放大倍数

 * 参数2: Y轴的放大倍数

 * 参数3: 原点X坐标

 * 参数4: 原点Y坐标

 */

canvas.scale(2, 4100,100);


旋转:

 

/**

* 原点为中心,旋转30度(顺时针方向为正方向 )

* 参数: 旋转角度

*/

canvas.rotate(30);

 

/** * 以(100,100)为中心,旋转30度,顺时针方向为正方向

* 参数: 旋转角度

*/

canvas.rotate(30,100,100);


save()方法还会有一个返回值,我们也可以调用restoreToCount(int saveCount)方法,将这个返回值作为参数传递进去,就可以将Canvas还原成某一个特定的save()状态。

 

/* * 同时绘制多条线。

 

* 参数1:float数组:每四个一组为一条线。最后不足四个,就忽略那些值。

* 参数2:画笔对象

*/

canvas.drawLines(new float[]{100,100,200,200,200,100,300,100}, p);


 

 

 

Paint画笔

paint.setAntiAlias设置抗锯齿

 

Canvas.drawText绘制文字为什么会偏上?

如果你经常使用Canvasdraw***方法去绘制一些图像图形,你会知道绘制的时候坐标是从Canvas左上角开始计算的,如果想要把一个图像放到某个位置,直接drawBitmap传递图片左上角的坐标就行了。

drawText就不一样了,如果你传递进去字符串,会发现文字的位置和你指定的不一样。

卧槽为啥。Android的文档也没有仔细说,打开源码一看,又跑到native代码里去执行了。经过我奋力地Google,终于把这个问题搞清楚了。

 

对于一段文字来说,如果你想把他画到Canvas上,首先你要确定这段文字的范围,即宽度和高度,那么怎么去取这一段的高度呢,如果你在网上搜,会有很多种答案,具体应该用哪一种呢?这要看你到底需要什么样的尺寸了。

Paint.getTextBounds: 当你通过这个方法来获取尺寸的时候,你可以得到能够包裹文字的最小矩形,就是图中红色边框的那部分,你可以得到一个Rect对象,包含这个最小尺寸的几个值。坑其实就在这里:这里的Rect对象坐标并不是以左上角为准的,而是相对于左边中间靠下位置的一个点,就是图中的黄色五角星。而这里水平的Baseline指的是字符串对齐的一条线(真正的含义可以需要更深入了解字体渲染的知识了)。既然这样,r.top就是一个负值了,r.bottom会是一个小一点的正值,r.leftr.right在图中画的都很清楚。通过r.width()r.height()来获取尺寸。

那么文字的偏移就好说了,比如说你要把文字画在Canvas的左上角,坐标是(0,0),但是当你通过:

1

canvas.drawText(“dangwen”,0,0,paint);

来画文字的时候,发现只有文字的下半部分画出来了,因为你传递进去的参数应该是以Baseline为标准的,正确的方法是:

1

canvas.drawText(“dangwen”,-r.left,-r.top,paint);

Paint.getFontMetricsInt(): 当你通过这里方法来获取尺寸的时候,你获取的只是一个垂直方向上的尺寸,这里的ascent代表的是字体的上部,descent代表的是字体的下部,这里需要注意的是这和上面获得的Recttopbottom不太一样,他们比比ascentdescent距离稍微小一些,这些具体的高度可能和不同的字体和渲染方式有关系,这里就不深入了 #我是不懂#

然后如果把文字写入TextView(图中蓝色部分)并且设置TextView的高度和宽度设为wrap_content,那么TextView的高度就正好是FontMetricsInt.top – FontMetricsInt.bottom, 那宽度呢? Paint.measureText()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值