我記得我在剛開始接觸自定義控件的時候,當我拿到各種坐標點的時候入偷,我就知道它存在一個坐標系,但具體怎么個坐標系法械哟,卻不是太清楚盯串,今天就開始整理一下。
首先戒良,坐標系是依附于canvas上的,canvas實際上就是一個用來保存像素的Bitmap,我們自定義控件其實就是根據(jù)坐標在canvas上畫東西的一個過程冠摄。
canvas里的兩種坐標系
一糯崎、Canvas自己的坐標系
首先看一下圖
我們假設藍色的部分就是canvas畫板,那么canvas自己的坐標系原點就在左上角河泳,同時原點往右就是x軸的正半軸沃呢,往下就是y軸的正半軸
!!!需要注意的是,該坐標系有且只有一個拆挥,唯一不變
二薄霜、Canvas繪圖坐標系
繪圖坐標系不是唯一不變的,它與canvas的Matrix有關系纸兔,當Matrix發(fā)生改變的時候惰瓜,繪圖坐標系也對應著進行改變,同時這個過程是不可逆的汉矿。
Matrix又是通過我們設置translate(平移)崎坊、rotate(旋轉)、scale(縮放)洲拇、skew(斜拉)來進行改變
下面從坐標轉換來理解canvas繪圖坐標系
來看代碼
//首先初始化畫筆
paint = new Paint();
paint.setColor(Color.RED);//設置畫筆紅色
paint.setStyle(Paint.Style.FILL);//填充內部
paint.setAntiAlias(true);//消除鋸齒
paint.setStrokeWidth(30);//寬度
//為了方便觀察奈揍,先把canvas背景設置為灰色,再移動到點(200赋续,200)處
canvas.drawColor(Color.GRAY);
canvas.translate(200,200);
先畫一個紅色的矩形
RectF rectF = new RectF(0,0,600,700);
canvas.drawRect(rectF,paint);
//然后繪圖坐標系平移到點(100男翰,100),畫綠色的框框
canvas.translate(100,100);
paint.setColor(Color.GREEN);
canvas.drawRect(rectF,paint);
//然后繪圖坐標系旋轉20度纽乱,畫黃色的框框
canvas.rotate(20);
paint.setColor(Color.YELLOW);
canvas.drawRect(rectF,paint);
這里我們再次來看一下這個過程蛾绎,首先我們把canvas畫布變成灰色,然后移動畫紅框框迫淹,再移動畫綠框框秘通,再旋轉畫黃色的框框
!敛熬! 我們發(fā)現(xiàn)灰色的部分自始自終都沒有移動肺稀,而我們又通過一系列操作畫了3個不同顏色的框框,說明灰色的坐標系沒有變应民,而畫框框的坐標系一直在改變话原。所以這里再次說明夕吻,canvas自己的坐標系有且只有一個,且唯一不變繁仁,還有一個繪圖坐標系涉馅,他會根據(jù)我們的操作進行相應的偏移.
下面分別看一下其它幾種改變繪圖坐標系的操作代碼
縮放Scale
RectF r = new RectF(0, 0, 400, 500);
canvas.drawRect(r, paint);
paint.setColor(Color.BLUE);
//sx,sy:分別對x/y方向的一個縮放系數(shù),畫布的縮放會導致里面所有的繪制的東西都會有一個縮放效果
canvas.scale(1.5f, 0.5f);
canvas.drawRect(r, paint);*/
斜拉畫布Skew
RectF r = new RectF(100, 100, 600, 800);
canvas.drawRect(r, paint);
paint.setColor(Color.BLUE);
//sx,sy傾斜度:X軸方向上傾斜60度,tan60=根號3
canvas.skew(1.73f, 0);
canvas.drawRect(r, paint);
嗯黄虱,差不多就這樣了
版權聲明:個人原創(chuàng)稚矿,若轉載,請注明出處
+GetTmBean