• 使用uniapp实现时钟功能


    1. 介绍uniapp框架

    uniapp是一个基于Vue.js开发跨平台应用的前端框架,可以将同一套代码编译成多个平台的应用程序。其优势在于开发便捷、跨平台性强,适用于开发多种类型的应用程序。

    2. 创建时钟组件

    在uniapp中创建时钟组件需要使用canvas来绘制时钟的外框和指针。在template中创建包含canvas元素的视图容器,可以为时钟组件指定适当的大小和位置。

    						<canvas canvas-id="clockCanvas">canvas>
    3. 绘制时钟元素

    通过获取绘图上下文,可以使用canvas绘制时钟的外框、刻度和数字。根据当前时间来更新时钟的显示,确保时钟能够实时显示当前时间。

    1. const ctx = uni.createCanvasContext('clockCanvas', this);
    2. // 绘制时钟外框
    3. ctx.beginPath();
    4. ctx.arc(40, 40, 35, 0, 2 * Math.PI);
    5. // ctx.setStrokeStyle('#590D75'); // 设置时钟外框
    6. ctx.stroke();
    7. // 绘制时钟刻度
    8. for (let i = 0; i < 12; i++) {
    9. ctx.save();
    10. ctx.translate(40, 40);
    11. ctx.rotate((i * 30 * Math.PI) / 180);
    12. ctx.beginPath();
    13. ctx.moveTo(0, -30);
    14. ctx.lineTo(0, -33);
    15. ctx.stroke();
    16. ctx.restore();
    17. }
    18. // 绘制时钟刻度带数字
    19. ctx.setFontSize(10); // 修改字体大小为12
    20. for (let i = 1; i <= 12; i++) {
    21. const angle = (i * 30 * Math.PI) / 180;
    22. const x = 40 + 25 * Math.sin(angle);
    23. const y = 40 - 25 * Math.cos(angle);
    24. ctx.fillText(i, x - 4, y + 5);
    25. }
    4. 实现定时器功能

    通过实现定时器功能,可以每隔一段时间更新一次时钟的显示,使时钟能够实时展示当前时间。这样可以确保时钟的准确性和实用性。

    1. // 获取当前时间
    2. const now = new Date();
    3. const hours = now.getHours();
    4. const minutes = now.getMinutes();
    5. const seconds = now.getSeconds();
    5. 设置时钟样式

    设置时钟的样式包括设置容器的样式以及canvas元素的大小和位置。此外,还可以设置指针的颜色和长度,以及时钟的外观样式,使时钟看起来更加美观和个性化

    1. // 绘制时针
    2. ctx.save();
    3. ctx.translate(40, 40);
    4. ctx.rotate(((hours % 12) * 30 + (minutes / 60) * 30) * (Math.PI / 180));
    5. ctx.setStrokeStyle('#000000'); // 设置时针颜色为红色
    6. ctx.beginPath();
    7. ctx.moveTo(0, 0);
    8. ctx.lineTo(0, -15);
    9. ctx.stroke();
    10. ctx.restore();
    11. // 绘制分针
    12. ctx.save();
    13. ctx.translate(40, 40);
    14. ctx.rotate((minutes * 6 + (seconds / 60) * 6) * (Math.PI / 180));
    15. ctx.setStrokeStyle('#3f3f3f'); // 设置分针颜色为红色
    16. ctx.beginPath();
    17. ctx.moveTo(0, 0);
    18. ctx.lineTo(0, -20);
    19. ctx.stroke();
    20. ctx.restore();
    21. // 绘制秒针
    22. ctx.save();
    23. ctx.translate(40, 40);
    24. ctx.rotate(seconds * 6 * (Math.PI / 180));
    25. ctx.setStrokeStyle('#b4b4b4'); // 设置秒针颜色为绿色
    26. ctx.beginPath();
    27. ctx.moveTo(0, 0);
    28. ctx.lineTo(0, -25);
    29. ctx.stroke();
    30. ctx.restore();
    31. ctx.draw();
    6.总结

    uniapp实现指针主要是通过canvas画布绘制,通过定时器逐秒改变指针;一下是完整代码

    1. <template>
    2. <view class="container">
    3. <canvas canvas-id="clockCanvas">canvas>
    4. view>
    5. template>
    6. <script>
    7. export default {
    8. data(){
    9. return{
    10. time:null
    11. }
    12. },
    13. onReady() {
    14. this.drawClock();
    15. this.startClock();
    16. },
    17. onUnload() {
    18. this.stopClock();
    19. },
    20. methods: {
    21. drawClock() {
    22. const ctx = uni.createCanvasContext('clockCanvas', this);
    23. // 获取当前时间
    24. const now = new Date();
    25. const hours = now.getHours();
    26. const minutes = now.getMinutes();
    27. const seconds = now.getSeconds();
    28. // 绘制时钟外框
    29. ctx.beginPath();
    30. ctx.arc(40, 40, 35, 0, 2 * Math.PI);
    31. ctx.stroke();
    32. // 绘制时钟刻度
    33. for (let i = 0; i < 12; i++) {
    34. ctx.save();
    35. ctx.translate(40, 40);
    36. ctx.rotate((i * 30 * Math.PI) / 180);
    37. ctx.beginPath();
    38. ctx.moveTo(0, -30);
    39. ctx.lineTo(0, -33);
    40. ctx.stroke();
    41. ctx.restore();
    42. }
    43. // 绘制时钟刻度带数字
    44. ctx.setFontSize(12); // 修改字体大小为12
    45. for (let i = 1; i <= 12; i++) {
    46. const angle = (i * 30 * Math.PI) / 180;
    47. const x = 40 + 25* Math.sin(angle);
    48. const y = 40 - 25* Math.cos(angle);
    49. ctx.fillText(i, x - 4, y + 5);
    50. }
    51. // 绘制时针
    52. ctx.save();
    53. ctx.translate(40, 40);
    54. ctx.rotate(((hours % 12) * 30 + (minutes / 60) * 30) * (Math.PI / 180));
    55. ctx.beginPath();
    56. ctx.moveTo(0, 0);
    57. ctx.lineTo(0, -20);
    58. ctx.stroke();
    59. ctx.restore();
    60. // 绘制分针
    61. ctx.save();
    62. ctx.translate(40, 40);
    63. ctx.rotate((minutes * 6 + (seconds / 60) * 6) * (Math.PI / 180));
    64. ctx.beginPath();
    65. ctx.moveTo(0, 0);
    66. ctx.lineTo(0, -25);
    67. ctx.stroke();
    68. ctx.restore();
    69. // 绘制秒针
    70. ctx.save();
    71. ctx.translate(40, 40);
    72. ctx.rotate(seconds * 6 * (Math.PI / 180));
    73. ctx.beginPath();
    74. ctx.moveTo(0, 0);
    75. ctx.lineTo(0, -28);
    76. ctx.stroke();
    77. ctx.restore();
    78. ctx.draw();
    79. },
    80. startClock() {
    81. this.timer = setInterval(() => {
    82. this.drawClock();
    83. }, 1000); // 每秒更新一次钟表
    84. },
    85. stopClock() {
    86. clearInterval(this.timer);
    87. }
    88. }
    89. }
    90. script>
    91. <style>
    92. .container {
    93. display: flex;
    94. justify-content: center;
    95. align-items: center;
    96. }
    97. canvas{
    98. width: 80px !important;
    99. height: 80px !important;
    100. display: flex;
    101. justify-content: center;
    102. align-items: center;
    103. }
    104. style>

    如果您想改变指针颜色长短等属性可以修改以下属性

    1. ctx.save(): 保存当前绘图上下文的状态。
    2. ctx.translate(40, 40): 将绘图原点移动到(40, 40)的位置,即时钟的中心。
    3. ctx.rotate(((hours % 12) * 30 + (minutes / 60) * 30) * (Math.PI / 180)): 通过旋转画布的方式来绘制时针,根据当前时间计算时针的旋转角度,并将画布旋转到相应的角度。
    4. ctx.setStrokeStyle('#000000'): 设置绘制线条的颜色为黑色。
    5. ctx.beginPath(): 开始一个新的绘制路径。
    6. ctx.moveTo(0, 0): 将画笔移动到指定的坐标(0, 0)。
    7. ctx.lineTo(0, -15): 从当前位置绘制一条直线到指定的坐标(0, -15),这里设置了时针的长度为15
    8. ctx.stroke(): 绘制已定义的路径。
    9. ctx.restore(): 恢复之前保存的绘图上下文的状态。

    希望以上文章对您有所帮助

  • 相关阅读:
    算法与数据结构-贪心算法
    zookeeper未授权漏洞复现及处理
    std::map中的自定义key避免踩坑
    【吴恩达机器学习-笔记整理】SVM-支持向量机(新的代价函数,最大间隔,高斯核函数,特征数与样本数不同大小关系时的选择)
    Java面试题之cpu占用率100%,进行定位和解决
    python字符串插入变量的多种方法
    fseek 写操作定位无效问题
    设计模式初版讲解
    Spring Boot项目中使用jdbctemplate 操作MYSQL数据库
    交错序列——差分:GZOI2023D2T3
  • 原文地址:https://blog.csdn.net/zzx262625/article/details/134386051