Garmin MonkeyC的寫法和經(jīng)驗(yàn)

避免

  • 通過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)建文本
    一共有三種方法,
  1. 默認(rèn)模板會提供第一種, 也就是在resources/layouts下的xml配置文件里直接配置, 并通過onLayout加載進(jìn)來
function onLayout(dc) {
        setLayout(Rez.Layouts.WatchFace(dc));
}
  1. 創(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 并不是垂直居中, 你如何得到文本的高度呢, 非常簡單

  1. 如果用上面第二種方法創(chuàng)建的文本, 并不能直接對對象進(jìn)行獲取txt.height, 因?yàn)闆]有進(jìn)行draw(dc)渲染, 需要在onUpdate(dc)中進(jìn)行了它draw(dc)后獲取位置
  2. 第一種方法太麻煩了, 而且刷新時(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;
  1. 隱藏屬性, 發(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ò)誤

  1. 輸出log
    Sys.println(str);
  2. 彈出錯(cuò)誤
    Sys.error(str);
  • 如何使用數(shù)學(xué)函數(shù)Math
    using Toybox.Math;
  1. 獲取隨機(jī)數(shù)
function rand(num){
        Math.srand(Math.rand());
        return Math.rand()%num;
}
  1. 獲取隨機(jī)0~1小數(shù)
function ran(){
        Math.srand(Math.rand());
        return Math.rand()%10000/10000.0f;
}
  • 繪制圖形
    Toybox::Graphics::Dc
  1. clear 用背景色填充屏幕
  2. clearClip 重置dc整個(gè)區(qū)域 (2.3)
  3. drawArc(x, y, r, attr, degreeStart, degreeEnd) 畫弧
  4. drawBitmap(x, y, rez) 將資源貼圖繪制上來
  5. drawCircle(x, y, radius) 畫圈
  6. drawEllipse(x, y, a, b) 畫橢圓圈
  7. drawLine(x1, y1, x2, y2) 畫線
  8. drawPoint(x, y) 畫點(diǎn)
  9. drawRectangle(x, y, width, height) 畫矩形框
  10. drawRoundedRectangle(x, y, width, height, radius) 畫圓角矩形框
  11. drawText(x, y, font, text, justification) 繪制文本
  12. fillCircle(x, y, radius) 畫圓
  13. fillEllipse(x, y, a, b) 畫橢圓
  14. fillPolygon(pts) 畫多邊形
  15. fillRectangle(x, y, width, height) 畫矩形
  16. fillRoundedRectangle(x, y, width, height, radius) 畫圓角矩形
  17. setClip(x, y, width, height) 設(shè)置dc的繪制區(qū)域
  18. setColor(foreground, background) 設(shè)置前景色和背景色, 通過創(chuàng)建對象后刷新不會因?yàn)閟etColor而改變, 需要通過自己的函數(shù)setColor以及setBackgroundColor進(jìn)行改變
  19. 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è)人感覺沒太大興趣)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語言,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢閱讀 100,617評論 9 468
  • 配置是網(wǎng)上找的,然后進(jìn)行了最基礎(chǔ)的修改 字體文件需要復(fù)制到 /usr/share/fonts/TTF/conky ...
    29042155e66f閱讀 9,209評論 0 4
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 7,322評論 0 17
  • 作者:二次元貓小姐 年初,好友阿玲的老公投資失敗,小倆口心里都有點(diǎn)別扭。 這半年來,倆人時(shí)不時(shí)為一些雞毛蒜皮的小事...
    二次元貓小姐閱讀 359評論 0 3
  • 筆種相思豆, 雨打流戀眸; 懷香十指扣, 繾綣滌夢揉。
    籪簫殘語閱讀 210評論 0 0

友情鏈接更多精彩內(nèi)容