# Development Guidelines on Clock Apps ## Overview This document describes how to quickly set up a development environment \(using the Hi3516D V300 development board\) and develop a clock app running on OpenHarmony. You can click [here](https://gitee.com/openharmony/app_samples/tree/master/common/Clock) to obtain the sample code. The clock app displays the current time, as shown in the following figure. **Figure 1** Clock display effect ![](figures/clock.png) ## Preparations Download and install DevEco Studio. For details, see the [HUAWEI DevEco Studio User Guide](../../application-dev/quick-start/deveco-studio-user-guide-for-openharmony.md). ## How to Develop The Clock app displays the current time through a clock face and numbers. As shown in [Figure 1 Clock display effect](#fig7763172132019), the UI consists of two parts: - Clock face area: displays a dynamic analog clock whose hands rotate accurately. - Digital time area: displays the current time in numerals. To build such an app, we can create a page that has a flexible layout with two rows vertically arranged. The development procedure is as follows: 1. Add a root component **** to the **.hml** file. Note that each **.hml** file can contain only one root component. The sample code is as follows: ```
``` **class="container"** indicates the style used by the component. The **container** is a style class defined in the **index.css** file. ``` .container { flex-direction: column; justify-content: center; align-items: center; width: 100%; height: 100%; } ``` The height and width of the root component **** are set in the style class. Note that the height and width must be explicitly specified \(except for some components, such as ****\). Otherwise, the component may fail to display. In the **container** style class, the **flex-direction** attribute is set to **column**, which means that child components of **** are vertically arranged from top to bottom for implementing the flexible page layout. 2. Implement clock hand rotation using the **** component. The **** component provides a stack container where child components are successively stacked and the latter one overwrites the previous one. Add a stack container to the root component. The sample code is as follows: ```
``` **style="transform: rotate\(\{\{ second \* 6 \}\}deg\)** sets the rotation event of a component. **transform** translates, rotates, or scales an image. **rotate** rotates an image. You can set an image to rotate around its x-axis or y-axis. Set attributes, such as the height, width, and position, of the stack component in the CSS file. The sample code is as follows: ``` .stack { flex-direction: column; justify-content: center; align-items: center; width: 100%; height: 50%; } ``` Set attributes, such as the height and width, of the clock-bg component in the CSS file. The sample code is as follows: ``` .clock-bg { width: 80%; height: 80%; object-fit: scale-down; } ``` Set attributes, such as the height and width of the hour, minute, and second hands, of the clock-hand component in the CSS file. The sample code is as follows: ``` .clock-hand { width: 25%; height: 65%; object-fit: contain; } ``` Add a timer in the **index.js** file to update the hour, minute, and second variables in real time so that the time can be automatically updated on the app UI. The sample code is as follows: ``` export default { timer: undefined, // Define parameters. data: { hour: 0, // Define hours. minute: 0, // Define minutes. second: 0 // Define seconds. }, onInit () { this.updateTime(); this.timer = setInterval(this.updateTime, 1000)// Set the timer to 1 second. }, updateTime: function () { var nowTime = new Date() this.hour = nowTime.getHours() this.minute = nowTime.getMinutes() this.second = nowTime.getSeconds() if (this.hour < 10) { this.hour = '0' + this.hour } if (this.minute < 10) { this.minute = '0' + this.minute } if (this.second < 10) { this.second = '0' + this.second } }, } ``` 3. Display the current time in numerals under the analog clock. Add the text component at the end of the root layout. The following example shows the UI structure: ``` {{ hour }}:{{ minute }}:{{ second }} ``` class=**"digit-clock"** sets the height, width, and font size of the component. The sample code is as follows: ``` .digit-clock { font-size: 58px; width: 100%; margin-top: 0px; text-align: center; } ``` 4. Set the style, animation effect, and dynamic data binding for all components. The complete sample code is as follows: - **index.hml** ```
{{ hour }}:{{ minute }}:{{ second }}
``` - **index.css** ``` .container { flex-direction: column; justify-content: center; align-items: center; width: 100%; height: 100%; } .stack { flex-direction: column; justify-content: center; align-items: center; width: 100%; height: 50%; } .digit-clock { font-size: 58px; width: 100%; margin-top: 0px; text-align: center; } .clock-bg { width: 80%; height: 80%; object-fit: scale-down; } .clock-hand { width: 25%; height: 65%; object-fit: contain; } ``` - **index.js** A **.js** file is used to implement logic interactions of the clock app. The following **.js** file implements the function of periodically obtaining the system time. ``` export default { timer: undefined, data: { hour: 0, minute: 0, second: 0 }, onInit() { this.updateTime() this.timer = setInterval(this.updateTime, 1000) }, updateTime: function () { var nowTime = new Date() this.hour = nowTime.getHours() this.minute = nowTime.getMinutes() this.second = nowTime.getSeconds() if (this.hour < 10) { this.hour = '0' + this.hour } if (this.minute < 10) { this.minute = '0' + this.minute } if (this.second < 10) { this.second = '0' + this.second } }, onDestroy() { clearInterval(this.timer); } } ``` ## Signing and Packaging After finishing writing the app code, you need to sign and package the app before running it on a real device. For details, see [Signing and Packaging Guide](https://developer.harmonyos.com/en/docs/documentation/doc-guides/ohos-debugging-and-running-0000001263040487#section17660437768). ## Running on the Real Device Before you install the app and run it on the development board, install the DevEco Device Tool by following operations provided in [HUAWEI DevEco Device Tool User Guide](https://device.harmonyos.com/en/docs/ide/user-guides/service_introduction-0000001050166905). Burn OpenHarmony into the development board, and run it on the board. For details about how to build, burn, and run an image, see . After the image is running normally and the system is started properly, perform the following steps to install or uninstall the app: 1. Obtain the HDC client from the following path: ``` developtools/hdc_standard/prebuilt/windows/hdc_std.exe ``` Change the HDC client name to **hdc.exe** and add the path above to the system environment variable **path**. 2. Open the **cmd** window, and run the following commands to push the HAP file to the device directory, and install it: ``` hdc install clock.hap ``` 3. Run the following command to start the app. **ohos.samples.clock** indicates the app package name, and **MainAbility** indicates the ability started by the app. ``` hdc shell aa start -d 123 -a ohos.samples.clock.MainAbility -b ohos.samples.clock ``` 4. \(Optional\) Run the following command to uninstall the app. **ohos.samples.clock** indicates the app package name. ``` hdc shell bm uninstall -n ohos.samples.clock ``` ## FAQs ### hdc\_std Fails to Connect to a Device - **Symptom** **\[Empty\]** is displayed in the output after the **hdc\_std list targets** command is run. - **Possible Causes and Solutions** 1. The device fails to be identified. Check whether **HDC Device** exists in the universal serial bus device of the device manager. If **HDC Device** does not exist, the device cannot be connected. In this case, remove and then insert the device or burn the latest image for the device. 2. hdc\_std works improperly. Run the **hdc kill** or **hdc start -r** command to kill or restart the HDC service, and then run the **hdc list targets** command to check whether device information is obtained. 3. hdc\_std does not match the device. If the latest image is burnt for the device, hdc\_std must also be of the latest version. As hdc\_std is updated continuously, obtain hdc\_std of the latest version from the **developtools\_hdc\_standard** repository in the **prebuilt** directory. ### hdc\_std Fails to Run - **Symptom** The **hdc\_std.exe** file does not run after being clicked. - **Possible Causes and Solutions** **hdc\_std.exe** requires no installation and can be directly used on a disk. It can also be added to environment variables. Open the **cmd** window and run the **hdc\_std** command to use **hdc\_std.exe**.