美文网首页
Android 自定义view 之坐标系处理

Android 自定义view 之坐标系处理

作者: MiBoy | 来源:发表于2017-02-19 19:34 被阅读132次

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

    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

    相关文章

      网友评论

          本文标题:Android 自定义view 之坐标系处理

          本文链接:https://www.haomeiwen.com/subject/jwbjwttx.html