網頁

2020年12月11日 星期五

手機 App 程式設計- AppInventor2 -小時鐘

 題目

  1. 最上面出現 今天的 年月日、星期和目前時間。
  2. 下面的畫布出現指針式時鐘,有時、分、秒(用紅色表示)。
  3. 當碰觸到畫布時,可隨機變更畫布的背景顏色。
  4. 當手機橫放時,仍然可以在畫布的中央畫出小時鐘。

執行畫面



素材

本 app的 icon (圖示),可自己繪製或網路搜尋。
在Google 輸入關鍵字,如 clock  icon, 選擇 「圖片」,可找到相關的小圖示。
找到圖片,按下去,再按右鍵,選「另存圖片」,就可使用。但要注意著作財產權。

進入 Appinventor 

Google 輸入 appinventor 。選 「MIT App Inventor」。
選 「Create Apps」。

開新專案(project)

My projects / Start new project 。
輸入專案的 名稱,如 clock,按 「OK」鈕。
 專案的名稱只能使用大小寫字母、數字及「 _」符號,名稱的第一個字元必須是英文字母,不能使用中文字。

Designer 介面元件

Screen1(頁面或稱為畫面):
AppName:clock,可以改成 「小時鐘」(出現在手機上面的App名稱,可用中文)
Icon : 可以上傳1個 icon(圖示) (可選背景透明的圖示),此程式在手機上面的App 圖示。
按 「 Upload File」鈕。
按「選擇檔案」,選一個圖示,按「開啟」,再按「OK」鈕以上傳此圖示。


Screen1 元件相關屬性表

有關各個元件的詳細介紹,請參考 App Inventor 中文學習網,http://www.appinventor.tw/ 。

元件

類別

屬性

功能

Screen1

 

Title:我的小時鐘

AppName:clock

(出現在手機上面的App名稱)

Icon :clock.gif,可以上傳1icon圖示。

1Screen元件就是1個頁面(畫面)

Label1

User Interface(使用者介面)

Width:Fill Parent

Text:(清空)

TextAlignment:center:1

標籤

Canvas1

Drawing and Animation

BackgroundColor:Black

Height:Fill Parent

Width:Fill Parent

畫布,提供各式繪圖功能

Clock1

Sensors(感測器)

TimerInterval:1000 ,即1秒的意思,每隔1秒執行1次。

時鐘元件

完整 Blocks程式拼塊

Screen1
----------------------------------------------------------------
說明:
center_x :圓心的x 坐標。
center_y :圓心的y 坐標。
radius :圓的半徑。
second_len : 秒針的長度。
minute_len : 分針的長度。
hour_len : 時針的長度。
distance : 3、6、9、12這4個數字與圓的距離,設定成20。
edge_distance: 圓與畫布邊緣的距離,如果手機是直放( Portrait(垂直) ),就是與左右邊緣的距離。設定成 40。

----------------------------------------------------------------
----------------------------------------------------------------
說明:
center_x :畫布寬度的一半。
center_y :畫布高度的一半。圓心的座標為畫布的中心點。
radius :因螢幕可能直放或橫放,所以圓的半徑為  : 寬度和高度的最小值 的一半,再減去edge_distance(圓與畫布邊緣的距離)。
second_len : 秒針的長度,圓的半徑 - 15 。
minute_len : 分針的長度,秒針的長度 - 15。
hour_len : 時針的長度,秒針的長度 - 30。
因為 畫布的背景為黑色,所以PaintColor(繪圖顏色)設為白色。
----------------------------------------------------------------
----------------------------------------------------------------
說明:
show_date 此程序為顯示目前的日期和時間。
clock1.Now: 取得目前的日期和時間。
clock1.Year : 取得目前的日期和時間 中的年,為西元年。
所以要換成中華民國年 要減掉 1911。
----------------------------------------------------------------
----------------------------------------------------------------
說明:
先將畫布清空。
畫一個圓,圓心為 center_x,center_y,半徑為 raduis。fill: false, 不填滿。
----------------------------------------------------------------
----------------------------------------------------------------
說明:
在圓的外面,畫上12、3丶6、9 ,4個數字。

----------------------------------------------------------------
----------------------------------------------------------------
說明:
如果秒針的長度為 r,12點為0度,那麼秒針轉 θ 度,其終點座標為
x+rsinθ, y-rcosθ,如下圖所示:


秒針轉1圈(60秒)為360度,秒針1秒的度數為 1/60 *360 =6度。
所以 若現在為 second 秒,
x2= center_x +second_len*sin(second*6)
y2= center_y -second_len*cos(second*6)
second *6 怎麼拼塊出來?
按右鍵,選 External Inputs 或 Inline Inputs可以互相轉換。
----------------------------------------------------------------

----------------------------------------------------------------
說明:
參考上面秒針的圖。
分針轉1圈(60分)為360度,分針1分的度數為 1/60 *360 =6度。
所以 若現在為 minute 分,
x2= center_x +minute_len*sin(minute*6)
y2= center_y -minute_len*cos(minute*6)
----------------------------------------------------------------
----------------------------------------------------------------
說明:
參考上面秒針的圖。
call Clock1.Hour 傳回來的 Hour為24小時制,如下午 2點,傳回來時為 14時。所以 Hour要除以12 求餘數,等於 2 。
時針轉1圈(12小時)為360度,時針1時的度數為 1/12 *360 =30度。
但因為分針也會影響時針的位置,如 12:30 ,12/12 的餘數為 0 ,但時針並不是指到0度,而是15度,也就是  30/2=15度, 12點到1點 有30度。
所以 若現在為 hour 時,
x2= center_x +hour_len*sin( (hour/12 的餘數)*30 + (minute /2 的商) )
y2= center_y -hour_len*cos( (hour/12 的餘數)*30 + (minute /2 的商) )
----------------------------------------------------------------

----------------------------------------------------------------
說明:
random integer from 0 到 100,產生介於 0 到100 的亂數整數。
Canvas1.BackgroundColor :畫布的背景顏色,以 R(Red,紅色)、G(Green,綠色)、B(Blue,藍色)來表示,其值分別為 0~255。
----------------------------------------------------------------
---------------------------------------------------------------
說明:
因為 Clock1.TimerInterval 設為 1000,即 1秒的意思。
所以每隔1秒鐘,就觸發 Clock1.Timer 此事件程序。
此程序的內容,是重新秀出日期和時間,重畫小時鐘。
----------------------------------------------------------------
---------------------------------------------------------------
說明:
當螢幕的方向有更改,因畫布的寬度和高度也變動,所以要重新計算小時鐘的圓心座標和半徑,再重新畫小時鐘。 
----------------------------------------------------------------
---------------------------------------------------------------
說明:
當碰觸畫布時,以亂數的方法更改畫布的背景顏色。 
----------------------------------------------------------------