佳明表盘 c语言开发的吗,Garmin MonkeyC的写法和经验
避免
通過(guò)eclipse可以方便創(chuàng)建garmin項(xiàng)目, 但是要注意一點(diǎn), app/face/widget/data模板都不一樣, 中途切換會(huì)導(dǎo)致程序錯(cuò)誤或者api權(quán)限不夠, 想創(chuàng)建什么類型APP提前選擇好類型
背景色不要設(shè)置成復(fù)雜的貼圖紋理, 這樣疊加圖層時(shí)將渲染成非透明不混合方式以優(yōu)化手表性能和耗電量
分類
當(dāng)你用中文手表app的時(shí)候, 會(huì)列出來(lái)這幾項(xiàng), 下面進(jìn)行一一對(duì)應(yīng)和說(shuō)明
(按鍵以forrunner235為例)
中文名
英文名
按鍵
權(quán)限
應(yīng)用程序
application / app
所有按鍵
權(quán)限完全開通, 無(wú)任何限制, 制作碼表記錄軌跡等需要長(zhǎng)時(shí)間開啟的應(yīng)用, 在這里創(chuàng)建表盤會(huì)十分耗電切記
小工具
widget
確定/菜單/多層時(shí)支持返回/上/下
在手表默認(rèn)表盤上下切換的臨時(shí)應(yīng)用/小工具, 它不支持動(dòng)畫, 大概30/60秒就自動(dòng)回到默認(rèn)表盤, 適合堆放臨時(shí)信息, 比如心率/天氣運(yùn)動(dòng)量統(tǒng)計(jì)/電量顯示等
屏幕背景
watchface
無(wú)
默認(rèn)界面, 表盤在初始化/甩手腕/從其他應(yīng)用返回時(shí)提供秒鐘刷新, 幾秒后進(jìn)入省電模式, 變?yōu)榉昼娝⑿? 所以這里不適合做動(dòng)畫效果
數(shù)據(jù)字段
data field
無(wú)
為佳明運(yùn)動(dòng)app欄位顯示, 佳明運(yùn)動(dòng)app支持將屏幕分割出多個(gè)區(qū)域, 數(shù)據(jù)位會(huì)顯示在指定區(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 為文字描述的長(zhǎng)度
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)字體
只有相對(duì)大小的5種, 對(duì)應(yīng)每塊手表的相對(duì)大小, 如果你需要更大的字體, 則需要借助fnt擴(kuò)展, 或者使用位圖資源
1.0.x支持字體
FONT_XTINY 最小&纖細(xì)
FONT_TINY 最小號(hào)
FONT_SMALL 小號(hào)
FONT_MEDIUM 中號(hào)
FONT_LARGE 大號(hào)
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)最小號(hào)
FONT_SYSTEM_SMALL 系統(tǒng)小號(hào)
FONT_SYSTEM_MEDIUM 系統(tǒng)中號(hào)
FONT_SYSTEM_LARGE 系統(tǒng)大號(hào)
FONT_SYSTEM_NUMBER_MILD 系統(tǒng)大號(hào)+(只用于數(shù)字)
FONT_SYSTEM_NUMBER_MEDIUM 系統(tǒng)大號(hào)++ (只用于數(shù)字)
FONT_SYSTEM_NUMBER_HOT 系統(tǒng)大號(hào)+++(只用于數(shù)字)
FONT_SYSTEM_NUMBER_THAI_HOT 系統(tǒng)大號(hào)++++ (只用于數(shù)字)
https://developer.garmin.com/downloads/connect-iq/monkey-c/doc/Toybox/Graphics.html
使用fnt字體 (fnt制作工具請(qǐng)自行搜索)
先將fnt文件拷貝到resources/drawables里面
然后修改描述文件drawables.xml, 將默認(rèn)的drawables集合外面包含一層resources
把font加入進(jìn)去
代碼中調(diào)用此字體
var fntTime1 = Ui.loadResource(Rez.Fonts.fntTime1);
創(chuàng)建文本
一共有三種方法,
默認(rèn)模板會(huì)提供第一種, 也就是在resources/layouts下的xml配置文件里直接配置, 并通過(guò)onLayout加載進(jìn)來(lái)
function onLayout(dc) {
setLayout(Rez.Layouts.WatchFace(dc));
}
創(chuàng)建有對(duì)象控制的文本函數(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位置為問(wèn)題文本中心軸的位置, 而縱向呢, 縱向有兩種方法設(shè)置居中
當(dāng)你設(shè)置locY=>winSizeHeight*.5 并不是垂直居中, 你如何得到文本的高度呢, 非常簡(jiǎn)單
如果用上面第二種方法創(chuàng)建的文本, 并不能直接對(duì)對(duì)象進(jìn)行獲取txt.height, 因?yàn)闆](méi)有進(jìn)行draw(dc)渲染, 需要在onUpdate(dc)中進(jìn)行了它draw(dc)后獲取位置
第一種方法太麻煩了, 而且刷新時(shí)頻繁計(jì)算又費(fèi)事費(fèi)電, 其實(shí)很簡(jiǎn)單, 系統(tǒng)給了api解決這一問(wèn)題, 不需要渲染對(duì)象, 在創(chuàng)建之前就已經(jīng)知道這個(gè)字體的高度了
var ftHHalf = Gfx.getFontHeight(Gfx.FONT_SYSTEM_NUMBER_HOT)*.5f;
隱藏屬性, 發(fā)現(xiàn)還有更簡(jiǎn)單的設(shè)置方法....
設(shè)置justification為Gfx.TEXT_JUSTIFY_CENTER|Gfx.TEXT_JUSTIFY_VCENTER
如何使用數(shù)組
var pool = [];
加入對(duì)象
pool.add(obj);
獲取大小
pool.size();
遍歷
var len = pool.size();
for(var i=0;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會(huì)彈出警告, 提示權(quán)限不夠, 不進(jìn)行執(zhí)行
枚舉的創(chuàng)建和使用
MonkeyC既然從c語(yǔ)言簡(jiǎn)化而來(lái), 自然也支持枚舉
創(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通過(guò)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) 將資源貼圖繪制上來(lái)
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è)置前景色和背景色, 通過(guò)創(chuàng)建對(duì)象后刷新不會(huì)因?yàn)閟etColor而改變, 需要通過(guò)自己的函數(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()
這些都是任何語(yǔ)言都具備的功能, 然后下一篇如果經(jīng)驗(yàn)積累夠了會(huì)講手表感應(yīng)器api(心率,gps等), 或者手表自帶組件(個(gè)人感覺(jué)沒(méi)太大興趣)
總結(jié)
以上是生活随笔為你收集整理的佳明表盘 c语言开发的吗,Garmin MonkeyC的写法和经验的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 天天动听音乐播放器应用android源码
- 下一篇: aix相关