安卓圖形繪製一直以來感受都很繁瑣
在html5時,我用JavaScript封裝了一個HTML5的canvas庫。
HTML5感受和Android的canvas挺類似,因此考慮移植過來。
繪圖庫核心是用配置信息繪圖,經過邏輯運算繪圖
本篇會持續更新,記錄LogicCanvas的成長曆程html
對項目進行大規模重構,分解ShapePath類,優化調用形式,更好解耦
因爲邊線而致使的精準度問題已修正 加入剛剛屬性:路徑的方向,代號:dirhtml5
此次更新也挺厲害的,將Pos點類使用原型模式,避免不少地方都要new
Pos點類思想層面由點,升級到向量,實現了向量的基本用法
加入繪製文字功能(之前居然沒發現):目前只是放字和位置,之後會完善更多文字方面的功能
對座標系統進行必定的優化
Pos的向量形式使用有點龐大,新寫一篇文章講述,詳見:Android繪圖之和我一塊兒畫箭頭android
Painter採用單例模式 優化原型模式,各Shape採用深拷貝來解決構造較長、繁瑣的狀況 比較new 對象和拷貝的效率問題,拷貝一點。具體見文:來談談Java的深淺拷貝吧 完善向量部分,進行測試git
優化代碼github
支持點的繪製,及使用點對極座標方程進行模擬,詳見:Android模擬繪製極座標方程 優化BaseView編程
優化BaseViewcanvas
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
implementation 'com.github.toly1994328:logic-canvas-android:0.08'
複製代碼
//開始時初始化一個點對象
protected Pos pos = new Pos(0, 0);
複製代碼
//須要另外一個點的話:就好了,使用原型,避免new對象bash
pos.clone(x, y)
複製代碼
Painter painter = PainterEnum.INSTANCE.getInstance(canvas);
painter.draw(
new ShapeStar()
.num(5)//角的個數,數字任意
.R(100f)//外接圓半徑
.r(50f)////內接圓半徑
複製代碼
所謂公有屬性是指全部繪製圖形適用的屬性:包括 線條粗細(b)、線條顏色(ss)、填充顏色(ss)、 位移(p)、座標系(coo)、旋轉(rot)、縮放(sx,sy)屏幕適配dp單位(dp)微信
屬性 | 默認值 | 簡介 | 備註 |
---|---|---|---|
p | Pos(0,0) | 圖形距畫布左頂點偏移量 | |
rot | 0 | 旋轉角度 | 弧度制- |
sx | 0 | x縮放 | - |
sy | 0 | y縮放 | - |
coo | Pos(0,0) | 修改座標系 | 平移、縮放、旋轉使用 |
a | Pos(0,0) | 修改錨點 | - |
b | 1 | 線條粗 | - |
ss | "#000000" | 線條樣式 | - |
fs | "#0000ff" | 填充樣式 | - |
dir | 逆時針方向 | 方向 | - |
p 參數類型:Pos 注:爲了和數學更好契合,採用笛卡爾座標系(上右正),默認屏幕左上角(0,0)點 爲了明顯,使用工具欄繪製網格參考maven
painter.draw(new ShapeStar()
.num(5)
.R(100f)
.r(50f)
.p(pos.clone(200, -100)));//位移X,Y
複製代碼
coo 參數類型:Pos 爲了明顯,使用工具欄繪製座標系參考 注意:使用座標系後、平移、旋轉、縮放都會根據新的座標系來
painter.draw(new ShapeStar()
.num(5)
.R(100f)
.r(50f)
.coo(pos.clone(600, 200))//設置座標系
);
複製代碼
ss 描邊顏色 參數類型:int (顏色) b 描邊粗細 參數類型:int
painter.draw(new ShapeStar()
.num(5)
.R(100f)
.r(50f)
.p(pos.clone(200, -100))
.ss(Color.RED)//描邊顏色
.b(5f)//描邊線條粗細
);
複製代碼
rot 旋轉 參數類型:Float
painter.draw(new ShapeStar()
.num(5)
.R(100f)
.r(50f)
.ss(Color.RED)
.coo(pos.clone(600, 200))
.rot(90f)//設置旋轉
);
複製代碼
sx、sy 縮放比例 參數類型:Float
painter.draw(new ShapeStar()
.num(5)
.R(100f)
.r(50f)
.ss(Color.RED)
.coo(pos.clone(600, 200))
.sx(1.5f)
.sy(1.5f)
);
複製代碼
coo 參數類型:Pos
painter.draw(new ShapeStar()
.num(5)
.R(100f)
.r(50f)
.ss(Color.RED)
.coo(pos.clone(600, 200))
.a(pos.clone(100, 100))
.sx(1.5f)
.sy(1.5f)
);
複製代碼
fs 描邊顏色 參數類型:int (顏色)
painter.draw(new ShapeStar()
.num(5)
.R(100f)
.r(50f)
.coo(pos.clone(600, 200))
.fs(Color.YELLOW)
);
複製代碼
公共屬性展現到這裏
特有屬性:ps 參數類型 不定個數的Pos。 再次強調:默認使用的是0,0爲原點的笛卡爾座標系
painter.draw(
new ShapeLine()
.ps(pos.clone(0, 0), pos.clone(200, -200))
.b(5f)
);
複製代碼
painter.draw(
new ShapeLine()
.ps(
pos.clone(0, 0),
pos.clone(200, -200),
pos.clone(200,-400),
pos.clone(200,-400),
pos.clone(800,-400),
pos.clone(0,0)
).b(5f)
);
複製代碼
參數 : x 矩形寬 y:矩形高 r:矩形圓角
painter.draw(
new ShapeRect()
.x(1000/2f).y(618/2f).r(50f)
.b(5f).ss(Color.RED).p(pos.clone(100,-100))
);
複製代碼
dir true 逆時針方向繪製--默認 r 半徑
painter.draw(
new ShapeArc(1)
.r(100f)
.b(5f).ss(Color.RED)
.p(pos.clone(200,-200))
複製代碼
painter.draw(
new ShapeArc()
.r(100f).ang(135f)
.b(1f).ss(Color.RED)
.p(pos.clone(200,-100))
);
複製代碼
al 對齊方式:String 類型,效果下如圖 str 文字 size 大小
painter.drawText(
new ShapeText()
.str("Toly")//文字
.size(80)//大小
.al("<")//對齊方式
.p(400f,400f));
複製代碼
Path path = new Path();// 建立Path
path.lineTo(200, -200);// lineTo
path.lineTo(200,0);
path.close();
Shape shapeEmpty = new ShapeEmpty(path)
.b(6f).coo(400f, 400f);
painter.draw(shapeEmpty);
複製代碼
for (int i = 5; i < 10; i++) {
painter.draw(
new ShapeStar(ShapeStar.MODE_POLYGON)
.num(i).R(80f)
.b(4f)
.p(pos.clone(20+210*(i-5),-20)));//內接圓半徑
painter.draw(
new ShapeStar(ShapeStar.MODE_REGULAR)
.num(i).R(80f)
.b(4f)
.p(pos.clone(20+210*(i-5),-220)));//內接圓半徑
}
複製代碼
展現到這裏,持續更新,更多功能敬請期待 更新時間:2018-09-12:13:25 LogicCanvas-項目地址:github
[1]本文由張風捷特烈原創,轉載請註明
[2]歡迎廣大編程愛好者共同交流
[3]我的能力有限,若有不正之處歡迎你們批評指證,一定虛心改正
[4]你的喜歡與支持將是我最大的動力
QQ:1981462002 郵箱:1981462002@qq.com 微信:zdl1994328