佳明表盘 c语言开发的吗,Garmin MonkeyC的写法和经验
避免
通過eclipse可以方便創建garmin項目, 但是要注意一點, app/face/widget/data模板都不一樣, 中途切換會導致程序錯誤或者api權限不夠, 想創建什么類型APP提前選擇好類型
背景色不要設置成復雜的貼圖紋理, 這樣疊加圖層時將渲染成非透明不混合方式以優化手表性能和耗電量
分類
當你用中文手表app的時候, 會列出來這幾項, 下面進行一一對應和說明
(按鍵以forrunner235為例)
中文名
英文名
按鍵
權限
應用程序
application / app
所有按鍵
權限完全開通, 無任何限制, 制作碼表記錄軌跡等需要長時間開啟的應用, 在這里創建表盤會十分耗電切記
小工具
widget
確定/菜單/多層時支持返回/上/下
在手表默認表盤上下切換的臨時應用/小工具, 它不支持動畫, 大概30/60秒就自動回到默認表盤, 適合堆放臨時信息, 比如心率/天氣運動量統計/電量顯示等
屏幕背景
watchface
無
默認界面, 表盤在初始化/甩手腕/從其他應用返回時提供秒鐘刷新, 幾秒后進入省電模式, 變為分鐘刷新, 所以這里不適合做動畫效果
數據字段
data field
無
為佳明運動app欄位顯示, 佳明運動app支持將屏幕分割出多個區域, 數據位會顯示在指定區域中, 功能和應用程序一樣, 只是區域和按鍵有區別
代碼相關
獲取手表時間
var time = Sys.getClockTime();
time.sec time.min time.hour
用戶設置的時間格式12/24
Gfx.System.getDeviceSettings().is24Hour
根據用戶設置顯示小時
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]);
系統屏幕類型
var isShapeRect = Sys.getDeviceSettings().screenShape == Sys.SCREEN_SHAPE_RECTANGLE;
系統顏色
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 亮藍
COLOR_DK_BLUE 暗藍
COLOR_PINK 粉/亮紫
COLOR_PURPLE 暗紫
COLOR_TRANSPARENT 透明(盡量少用)
系統字體
只有相對大小的5種, 對應每塊手表的相對大小, 如果你需要更大的字體, 則需要借助fnt擴展, 或者使用位圖資源
1.0.x支持字體
FONT_XTINY 最小&纖細
FONT_TINY 最小號
FONT_SMALL 小號
FONT_MEDIUM 中號
FONT_LARGE 大號
FONT_NUMBER_MILD (只用于數字)
FONT_NUMBER_MEDIUM (只用于數字)
FONT_NUMBER_HOT (只用于數字)
FONT_NUMBER_THAI_HOT (只用于數字)
1.3.x支持字體
FONT_SYSTEM_XTINY 系統最小&纖細
FONT_SYSTEM_TINY 系統最小號
FONT_SYSTEM_SMALL 系統小號
FONT_SYSTEM_MEDIUM 系統中號
FONT_SYSTEM_LARGE 系統大號
FONT_SYSTEM_NUMBER_MILD 系統大號+(只用于數字)
FONT_SYSTEM_NUMBER_MEDIUM 系統大號++ (只用于數字)
FONT_SYSTEM_NUMBER_HOT 系統大號+++(只用于數字)
FONT_SYSTEM_NUMBER_THAI_HOT 系統大號++++ (只用于數字)
https://developer.garmin.com/downloads/connect-iq/monkey-c/doc/Toybox/Graphics.html
使用fnt字體 (fnt制作工具請自行搜索)
先將fnt文件拷貝到resources/drawables里面
然后修改描述文件drawables.xml, 將默認的drawables集合外面包含一層resources
把font加入進去
代碼中調用此字體
var fntTime1 = Ui.loadResource(Rez.Fonts.fntTime1);
創建文本
一共有三種方法,
默認模板會提供第一種, 也就是在resources/layouts下的xml配置文件里直接配置, 并通過onLayout加載進來
function onLayout(dc) {
setLayout(Rez.Layouts.WatchFace(dc));
}
創建有對象控制的文本函數
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)中繪制不帶函數控制的渲染
dc.setColor(Gfx.COLOR_WHITE, Gfx.COLOR_BLACK);
dc.drawText(100, 100 , fntTime1, i*10, Gfx.TEXT_JUSTIFY_CENTER);
不管哪一種都支持用fnt字體或系統內置字體
獲取文本大小
getTextDimensions(text, font)
如何文本居中
實際上設置 justification=>Gfx.TEXT_JUSTIFY_CENTER 可以令文本橫向居中, 也就是locX位置為問題文本中心軸的位置, 而縱向呢, 縱向有兩種方法設置居中
當你設置locY=>winSizeHeight*.5 并不是垂直居中, 你如何得到文本的高度呢, 非常簡單
如果用上面第二種方法創建的文本, 并不能直接對對象進行獲取txt.height, 因為沒有進行draw(dc)渲染, 需要在onUpdate(dc)中進行了它draw(dc)后獲取位置
第一種方法太麻煩了, 而且刷新時頻繁計算又費事費電, 其實很簡單, 系統給了api解決這一問題, 不需要渲染對象, 在創建之前就已經知道這個字體的高度了
var ftHHalf = Gfx.getFontHeight(Gfx.FONT_SYSTEM_NUMBER_HOT)*.5f;
隱藏屬性, 發現還有更簡單的設置方法....
設置justification為Gfx.TEXT_JUSTIFY_CENTER|Gfx.TEXT_JUSTIFY_VCENTER
如何使用數組
var pool = [];
加入對象
pool.add(obj);
獲取大小
pool.size();
遍歷
var len = pool.size();
for(var i=0;i
//do you want
}
如何設置計時器
var timer = new Timer.Timer();
timer.start(method(:requestUpdate), 10000, true);
停止/銷毀計時器
if(timer!=null){
timer.stop();
timer = null;
}
計時器只工作在app(任何時候), widget(關閉之前), face (喚醒狀態function onExitSleep()調用時) (休眠狀態 function onEnterSleep()記得銷毀和完成最后一次刷新表盤)
face在休眠狀態下調用timer會彈出警告, 提示權限不夠, 不進行執行
枚舉的創建和使用
MonkeyC既然從c語言簡化而來, 自然也支持枚舉
創建
enum{
TypeMode_Default,
TypeMode_Animation,
TypeMode_PowerSave
}
使用
switch(colorTemplete){
case TypeMode_PowerSave:
//do sth
break;
case TypeMode_Default:
default:
break;
}
強制Ui刷新
Ui.requestUpdate();
app通過animate或者timer可以達到每秒多次刷新
watchface可以在喚醒狀態使用timer刷新
如何輸出, 錯誤
輸出log
Sys.println(str);
彈出錯誤
Sys.error(str);
如何使用數學函數Math
using Toybox.Math;
獲取隨機數
function rand(num){
Math.srand(Math.rand());
return Math.rand()%num;
}
獲取隨機0~1小數
function ran(){
Math.srand(Math.rand());
return Math.rand()%10000/10000.0f;
}
繪制圖形
在Toybox::Graphics::Dc下
clear 用背景色填充屏幕
clearClip 重置dc整個區域 (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) 畫點
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) 設置dc的繪制區域
setColor(foreground, background) 設置前景色和背景色, 通過創建對象后刷新不會因為setColor而改變, 需要通過自己的函數setColor以及setBackgroundColor進行改變
setPenWidth(width) 設置線寬度
view的運行次序
插件和應用
onLayout() → onShow() → onUpdate() → onHide()
表盤
onLayout() → onShow() → onUpdate()
數據欄
onLayout() → onShow() → onUpdate()
這些都是任何語言都具備的功能, 然后下一篇如果經驗積累夠了會講手表感應器api(心率,gps等), 或者手表自帶組件(個人感覺沒太大興趣)
總結
以上是生活随笔為你收集整理的佳明表盘 c语言开发的吗,Garmin MonkeyC的写法和经验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 天天动听音乐播放器应用android源码
- 下一篇: aix相关