俗话说的好:好记性不如烂笔头啊。的确如此,在这么多年的开发中,有些东西一直记,有些东西也在一直忘。需要反复的去看,去理解。但是当你会过头来的时候,会发现,你又会对以前的东西有些认知,不仅会带你回忆当时为什么会这样想的,而且,还会对你现在的思维架构产生影响,所以很多人写博客,不光是为了给别人分享,而且还有对自己的共勉,小弟不才,文章写的不好,有些思维逻辑性跳跃大的话,还请见谅。
Android中自定义View,一般都是重写几个重要的方法,比如:
-
onDraw()
-
onMeasure()
-
onLayout()
-
Layout()
今天咱们说一下在onDraw 中的一些细节。
在onDraw 一开始的时候,整个屏幕都是画布,而且在最左上方,是画布的一个原点,坐标为(0,0),向右是x轴,为正轴,向下是y轴,为正轴,如果此时调用了 canvas.traslate(x,y)
方法,是移动的画布的一个坐标系,并不是移动的整个画布,举一个例子:我在画布上画了个弧度,然后此时调用canvas.traslate(x,y)
方法,原来弧度的位置是不会再变了,下次画笔的起始位置就是移动后的位置,看图说话。
移动之前的位置
移动之前的位置
然后我修改了代码 在画完内圆的时候,移动了画布的坐标系,xy分别为10
移动之后的位置
移动之后的位置
所以总结 画布移动的是坐标系。可以参考下 canvas变换与操作
讲的比较乱,既然说了移动的是坐标系,那咱们再来说下坐标系的问题。
这个主要体现在画弧度的时候
RectF rectF = new RectF(-radius, -radius, radius, radius);
//画弧度
canvas.drawArc(rectF, startAngle, sweepAngle, false, paint);
startAngle 起始角度,sweepAngle 是扫过的简单,sweepAngle>0的话为顺时针旋转,小于0为逆时针旋转。大家估计要问了 0度在哪个位置?我这不会画图 就口述吧。0度的位置其实和数学系中的坐标一样的,只不过
在常见的数学坐标系中角度增大方向为逆时针,
在默认的屏幕坐标系中角度增大方向为顺时针
参考文章安卓自定义View基础-角度与弧度
这一篇写的不错,专门介绍了角度和弧度之间的关系
先写到这里吧,谢谢 ! 这才发现原来写博客是件不容易的问题啊。
二
canvas.drawLine(startX,startY,stopX,stopY,paint);
这个方法画线的时候,如果paint没有指定StrokeWidth的时候,默认是1个像素,如果指定宽度为10 ,这个线会以坐标之间连接的线平均分配
Paste_Image.png
网友评论