Android 自定义view 之坐标系处理

俗话说的好:好记性不如烂笔头啊。的确如此,在这么多年的开发中,有些东西一直记,有些东西也在一直忘。需要反复的去看,去理解。但是当你会过头来的时候,会发现,你又会对以前的东西有些认知,不仅会带你回忆当时为什么会这样想的,而且,还会对你现在的思维架构产生影响,所以很多人写博客,不光是为了给别人分享,而且还有对自己的共勉,小弟不才,文章写的不好,有些思维逻辑性跳跃大的话,还请见谅。

Android中自定义View,一般都是重写几个重要的方法,比如:

  • onDraw()

  • onMeasure()

  • onLayout()

  • Layout()

今天咱们说一下在onDraw 中的一些细节。
在onDraw 一开始的时候,整个屏幕都是画布,而且在最左上方,是画布的一个原点,坐标为(0,0),向右是x轴,为正轴,向下是y轴,为正轴,如果此时调用了 canvas.traslate(x,y)
方法,是移动的画布的一个坐标系,并不是移动的整个画布,举一个例子:我在画布上画了个弧度,然后此时调用canvas.traslate(x,y)
方法,原来弧度的位置是不会再变了,下次画笔的起始位置就是移动后的位置,看图说话。


Android 自定义view 之坐标系处理_第1张图片
移动之前的位置

移动之前的位置

然后我修改了代码 在画完内圆的时候,移动了画布的坐标系,xy分别为10


Android 自定义view 之坐标系处理_第2张图片
移动之后的位置

移动之后的位置

所以总结 画布移动的是坐标系。可以参考下 canvas变换与操作

讲的比较乱,既然说了移动的是坐标系,那咱们再来说下坐标系的问题。


这个主要体现在画弧度的时候

RectF rectF = new RectF(-radius, -radius, radius, radius); 
//画弧度 
canvas.drawArc(rectF, startAngle, sweepAngle, false, paint);

startAngle 起始角度,sweepAngle 是扫过的简单,sweepAngle>0的话为顺时针旋转,小于0为逆时针旋转。大家估计要问了 0度在哪个位置?我这不会画图 就口述吧。0度的位置其实和数学系中的坐标一样的,只不过

在常见的数学坐标系中角度增大方向为逆时针,
在默认的屏幕坐标系中角度增大方向为顺时针
参考文章安卓自定义View基础-角度与弧度
这一篇写的不错,专门介绍了角度和弧度之间的关系

Android 自定义view 之坐标系处理_第3张图片

先写到这里吧,谢谢 ! 这才发现原来写博客是件不容易的问题啊。

canvas.drawLine(startX,startY,stopX,stopY,paint);

这个方法画线的时候,如果paint没有指定StrokeWidth的时候,默认是1个像素,如果指定宽度为10 ,这个线会以坐标之间连接的线平均分配

Android 自定义view 之坐标系处理_第4张图片
Paste_Image.png

你可能感兴趣的:(Android 自定义view 之坐标系处理)