避免
- 通過eclipse可以方便創(chuàng)建garmin項(xiàng)目, 但是要注意一點(diǎn), app/face/widget/data模板都不一樣, 中途切換會導(dǎo)致程序錯(cuò)誤或者api權(quán)限不夠, 想創(chuàng)建什么類型APP提前選擇好類型
- 背景色不要設(shè)置成復(fù)雜的貼圖紋理, 這樣疊加圖層時(shí)將渲染成非透明不混合方式以優(yōu)化手表性能和耗電量
分類
當(dāng)你用中文手表app的時(shí)候, 會列出來這幾項(xiàng), 下面進(jìn)行一一對應(yīng)和說明
(按鍵以forrunner235為例)
| 中文名 | 英文名 | 按鍵 | 權(quán)限 |
|---|---|---|---|
| 應(yīng)用程序 | application / app | 所有按鍵 | 權(quán)限完全開通, 無任何限制, 制作碼表記錄軌跡等需要長時(shí)間開啟的應(yīng)用, 在這里創(chuàng)建表盤會十分耗電切記 |
| 小工具 | widget | 確定/菜單/多層時(shí)支持返回/上/下 | 在手表默認(rèn)表盤上下切換的臨時(shí)應(yīng)用/小工具, 它不支持動(dòng)畫, 大概30/60秒就自動(dòng)回到默認(rèn)表盤, 適合堆放臨時(shí)信息, 比如心率/天氣運(yùn)動(dòng)量統(tǒng)計(jì)/電量顯示等 |
| 屏幕背景 | watchface | 無 | 默認(rèn)界面, 表盤在初始化/甩手腕/從其他應(yīng)用返回時(shí)提供秒鐘刷新, 幾秒后進(jìn)入省電模式, 變?yōu)榉昼娝⑿? 所以這里不適合做動(dòng)畫效果 |
| 數(shù)據(jù)字段 | data field | 無 | 為佳明運(yùn)動(dòng)app欄位顯示, 佳明運(yùn)動(dòng)app支持將屏幕分割出多個(gè)區(qū)域, 數(shù)據(jù)位會顯示在指定區(qū)域中, 功能和應(yīng)用程序一樣, 只是區(qū)域和按鍵有區(qū)別 |
代碼相關(guān)
- 獲取手表時(shí)間
var time = Sys.getClockTime();
time.sec time.min time.hour
用戶設(shè)置的時(shí)間格式12/24
Gfx.System.getDeviceSettings().is24Hour
根據(jù)用戶設(shè)置顯示小時(shí)
var hourAuto = (!Gfx.System.getDeviceSettings().is24Hour&&time.hour>12)?time.hour%12:time.hour;
hourAuto.format("%02d")
- 獲取日期
//Time.FORMAT_MEDIUM 為文字描述的長度
var date = Gregorian.info(Time.now(), Time.FORMAT_MEDIUM);
var timeString = Lang.format("$1$-$2$ $3$", [date.month,date.day,date.day_of_week]);
- 系統(tǒng)屏幕類型
var isShapeRect = Sys.getDeviceSettings().screenShape == Sys.SCREEN_SHAPE_RECTANGLE;
- 系統(tǒng)顏色
COLOR_WHITE 白
COLOR_LT_GRAY 亮灰
COLOR_DK_GRAY 暗灰
COLOR_BLACK 黑
COLOR_RED 亮紅
COLOR_DK_RED 暗紅
COLOR_ORANGE 橙色/暗黃
COLOR_YELLOW 亮黃
COLOR_GREEN 亮綠
COLOR_DK_GREEN 暗綠
COLOR_BLUE 亮藍(lán)
COLOR_DK_BLUE 暗藍(lán)
COLOR_PINK 粉/亮紫
COLOR_PURPLE 暗紫
COLOR_TRANSPARENT 透明(盡量少用)
- 系統(tǒng)字體
只有相對大小的5種, 對應(yīng)每塊手表的相對大小, 如果你需要更大的字體, 則需要借助fnt擴(kuò)展, 或者使用位圖資源
1.0.x支持字體
FONT_XTINY 最小&纖細(xì)
FONT_TINY 最小號
FONT_SMALL 小號
FONT_MEDIUM 中號
FONT_LARGE 大號
FONT_NUMBER_MILD (只用于數(shù)字)
FONT_NUMBER_MEDIUM (只用于數(shù)字)
FONT_NUMBER_HOT (只用于數(shù)字)
FONT_NUMBER_THAI_HOT (只用于數(shù)字)
1.3.x支持字體
FONT_SYSTEM_XTINY 系統(tǒng)最小&纖細(xì)
FONT_SYSTEM_TINY 系統(tǒng)最小號
FONT_SYSTEM_SMALL 系統(tǒng)小號
FONT_SYSTEM_MEDIUM 系統(tǒng)中號
FONT_SYSTEM_LARGE 系統(tǒng)大號
FONT_SYSTEM_NUMBER_MILD 系統(tǒng)大號+(只用于數(shù)字)
FONT_SYSTEM_NUMBER_MEDIUM 系統(tǒng)大號++ (只用于數(shù)字)
FONT_SYSTEM_NUMBER_HOT 系統(tǒng)大號+++(只用于數(shù)字)
FONT_SYSTEM_NUMBER_THAI_HOT 系統(tǒng)大號++++ (只用于數(shù)字)
https://developer.garmin.com/downloads/connect-iq/monkey-c/doc/Toybox/Graphics.html
- 使用fnt字體 (fnt制作工具請自行搜索)
- 先將fnt文件拷貝到resources/drawables里面
- 然后修改描述文件drawables.xml, 將默認(rèn)的drawables集合外面包含一層resources
- 把font加入進(jìn)去
- 代碼中調(diào)用此字體
<resources>
<drawables>
<bitmap id="LauncherIcon" filename="launcher_icon.png" />
</drawables>
<font id="fntTime1" filename="fntNum1.fnt" antialias="true"/>
</resources>
var fntTime1 = Ui.loadResource(Rez.Fonts.fntTime1);
- 創(chuàng)建文本
一共有三種方法,
- 默認(rèn)模板會提供第一種, 也就是在resources/layouts下的xml配置文件里直接配置, 并通過onLayout加載進(jìn)來
function onLayout(dc) {
setLayout(Rez.Layouts.WatchFace(dc));
}
- 創(chuàng)建有對象控制的文本函數(shù)
var txtUnit = new Ui.Text({
:text=>"",
:color=>Gfx.COLOR_WHITE,
:backgroundColor=>Gfx.COLOR_RED,
:font=>fntTime1,
:locX=>winW*.5f,
:locY=>i*winH*.2f,
:justification=>Gfx.TEXT_JUSTIFY_CENTER
});
//在onUpdate(dc)中繪制
txtUnit.draw(dc);
3.直接在onUpdate(dc)中繪制不帶函數(shù)控制的渲染
dc.setColor(Gfx.COLOR_WHITE, Gfx.COLOR_BLACK);
dc.drawText(100, 100 , fntTime1, i*10, Gfx.TEXT_JUSTIFY_CENTER);
不管哪一種都支持用fnt字體或系統(tǒng)內(nèi)置字體
獲取文本大小
getTextDimensions(text, font)如何文本居中
實(shí)際上設(shè)置justification=>Gfx.TEXT_JUSTIFY_CENTER可以令文本橫向居中, 也就是locX位置為問題文本中心軸的位置, 而縱向呢, 縱向有兩種方法設(shè)置居中
當(dāng)你設(shè)置locY=>winSizeHeight*.5并不是垂直居中, 你如何得到文本的高度呢, 非常簡單
- 如果用上面第二種方法創(chuàng)建的文本, 并不能直接對對象進(jìn)行獲取txt.height, 因?yàn)闆]有進(jìn)行draw(dc)渲染, 需要在onUpdate(dc)中進(jìn)行了它draw(dc)后獲取位置
- 第一種方法太麻煩了, 而且刷新時(shí)頻繁計(jì)算又費(fèi)事費(fèi)電, 其實(shí)很簡單, 系統(tǒng)給了api解決這一問題, 不需要渲染對象, 在創(chuàng)建之前就已經(jīng)知道這個(gè)字體的高度了
var ftHHalf = Gfx.getFontHeight(Gfx.FONT_SYSTEM_NUMBER_HOT)*.5f;
- 隱藏屬性, 發(fā)現(xiàn)還有更簡單的設(shè)置方法....
設(shè)置justification為Gfx.TEXT_JUSTIFY_CENTER|Gfx.TEXT_JUSTIFY_VCENTER
- 如何使用數(shù)組
var pool = [];
加入對象
pool.add(obj);
獲取大小
pool.size();
遍歷
var len = pool.size();
for(var i=0;i<len;i++){
//do you want
}
- 如何設(shè)置計(jì)時(shí)器
var timer = new Timer.Timer();
timer.start(method(:requestUpdate), 10000, true);
停止/銷毀計(jì)時(shí)器
if(timer!=null){
timer.stop();
timer = null;
}
計(jì)時(shí)器只工作在app(任何時(shí)候), widget(關(guān)閉之前), face (喚醒狀態(tài)
function onExitSleep()調(diào)用時(shí)) (休眠狀態(tài)function onEnterSleep()記得銷毀和完成最后一次刷新表盤<比如秒針消除掉>)
face在休眠狀態(tài)下調(diào)用timer會彈出警告, 提示權(quán)限不夠, 不進(jìn)行執(zhí)行
- 枚舉的創(chuàng)建和使用
MonkeyC既然從c語言簡化而來, 自然也支持枚舉
創(chuàng)建
enum{
TypeMode_Default,
TypeMode_Animation,
TypeMode_PowerSave
}
使用
switch(colorTemplete){
case TypeMode_PowerSave:
//do sth
break;
case TypeMode_Default:
default:
break;
}
強(qiáng)制Ui刷新
Ui.requestUpdate();
app通過animate或者timer可以達(dá)到每秒多次刷新
watchface可以在喚醒狀態(tài)使用timer刷新如何輸出, 錯(cuò)誤
- 輸出log
Sys.println(str); - 彈出錯(cuò)誤
Sys.error(str);
- 如何使用數(shù)學(xué)函數(shù)Math
using Toybox.Math;
- 獲取隨機(jī)數(shù)
function rand(num){
Math.srand(Math.rand());
return Math.rand()%num;
}
- 獲取隨機(jī)0~1小數(shù)
function ran(){
Math.srand(Math.rand());
return Math.rand()%10000/10000.0f;
}
- 繪制圖形
在Toybox::Graphics::Dc下
- clear 用背景色填充屏幕
- clearClip 重置dc整個(gè)區(qū)域 (2.3)
- drawArc(x, y, r, attr, degreeStart, degreeEnd) 畫弧
- drawBitmap(x, y, rez) 將資源貼圖繪制上來
- drawCircle(x, y, radius) 畫圈
- drawEllipse(x, y, a, b) 畫橢圓圈
- drawLine(x1, y1, x2, y2) 畫線
- drawPoint(x, y) 畫點(diǎn)
- drawRectangle(x, y, width, height) 畫矩形框
- drawRoundedRectangle(x, y, width, height, radius) 畫圓角矩形框
- drawText(x, y, font, text, justification) 繪制文本
- fillCircle(x, y, radius) 畫圓
- fillEllipse(x, y, a, b) 畫橢圓
- fillPolygon(pts) 畫多邊形
- fillRectangle(x, y, width, height) 畫矩形
- fillRoundedRectangle(x, y, width, height, radius) 畫圓角矩形
- setClip(x, y, width, height) 設(shè)置dc的繪制區(qū)域
- setColor(foreground, background) 設(shè)置前景色和背景色, 通過創(chuàng)建對象后刷新不會因?yàn)閟etColor而改變, 需要通過自己的函數(shù)setColor以及setBackgroundColor進(jìn)行改變
- setPenWidth(width) 設(shè)置線寬度
- view的運(yùn)行次序
插件和應(yīng)用
onLayout() → onShow() → onUpdate() → onHide()
表盤
onLayout() → onShow() → onUpdate()
數(shù)據(jù)欄
onLayout() → onShow() → onUpdate()
這些都是任何語言都具備的功能, 然后下一篇如果經(jīng)驗(yàn)積累夠了會講手表感應(yīng)器api(心率,gps等), 或者手表自帶組件(個(gè)人感覺沒太大興趣)