俗話說的好:好記性不如爛筆頭啊。的確如此,在這么多年的開發中,有些東西一直記,有些東西也在一直忘。需要反復的去看,去理解。但是當你會過頭來的時候,會發現,你又會對以前的東西有些認知,不僅會帶你回憶當時為什么會這樣想的,而且,還會對你現在的思維架構產生影響,所以很多人寫博客,不光是為了給別人分享,而且還有對自己的共勉,小弟不才,文章寫的不好,有些思維邏輯性跳躍大的話,還請見諒。
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 ,這個線會以坐標之間連接的線平均分配