当前位置: 首页 > wzjs >正文

湖北建设科技中心网站首页网站开发实训新的体会

湖北建设科技中心网站首页,网站开发实训新的体会,wordpress 国内镜像,vps建立多个网站文章目录 前言准备分析组成部分数值计算过程 开始第一步 画圆环第二步 画格子第三步 画数字第四、五步 画指针&定时更新最后一步 前言 你在 Android 上能画出来的东西,在鸿蒙上画不出来? 画个时钟嘛,有啥难的? 你行你上&…

文章目录

      • 前言
      • 准备
      • 分析
        • 组成部分
        • 数值计算
        • 过程
      • 开始
        • 第一步 画圆环
        • 第二步 画格子
        • 第三步 画数字
        • 第四、五步 画指针&定时更新
        • 最后一步

前言

你在 Android 上能画出来的东西,在鸿蒙上画不出来?
画个时钟嘛,有啥难的?
你行你上!
给钱就上!
给钱?早说嘛,来来来,现在就画

准备

画时钟需要画哪些元素?
圆圈、直线,没了,就这些,临时看一下canvas 相关的 api,这不都有么?直接画。
看看需要用的方法

arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, counterclockwise?: boolean): void

看下参数含义

参数类型必填默认值描述
xnumber0弧线圆心的x坐标值。
ynumber0弧线圆心的y坐标值。
radiusnumber0弧线的圆半径。
startAnglenumber0弧线的起始弧度。
endAnglenumber0弧线的终止弧度。
counterclockwisebooleanfalse是否逆时针绘制圆弧。

弧度制,一圈是 2π,这个需要注意一下,还有endAngle,是终止弧度,而不是需要画多少弧度,浅浅的尝试。


struct ClockViewTest {private settings: RenderingContextSettings = new RenderingContextSettings(true)private canvasRendering: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)build() {Canvas(this.canvasRendering).width("100%").height("100%").onReady(() => {let width = this.canvasRendering.widthlet height = this.canvasRendering.heightlet centerX = width / 2let centerY = height / 2//取长宽中小的一个做直径let maxRadius = Math.min(width, height) / 2//设置线的粗细this.canvasRendering.lineWidth = 4this.canvasRendering.arc(centerX, centerY, maxRadius-50, 0, 1, false)//设置线的颜色this.canvasRendering.strokeStyle = "#ff0000"this.canvasRendering.stroke()this.canvasRendering.beginPath()this.canvasRendering.arc(centerX, centerY, maxRadius - 30, 0, 1, true)//设置线的颜色this.canvasRendering.strokeStyle = "#00ff00"this.canvasRendering.stroke()})}
}

效果是这样的:
在这里插入图片描述

画直线就不用多说了,开干~~

分析

组成部分

指针是需要根据时间变化来转动的,表盘画好一次就不需要重绘了,偷个懒,搞两个 canvas 摞起来,底层画表盘,上层画指针,时间变了只重画上层指针就行了。

数值计算

简单的三角函数,但要注意是弧度制,数值别搞错了。
另外需要注意的是画布左上角坐标是(0,0),右下角坐标为(width,height)。

过程
  1. 先画一大一小两个圆圈组成一个圆环。
  2. 再划线把圆环均分 60 份,每 5 条线加粗一下。
  3. 再把圆周分成 12 份,对应位置画上1~12 数字。
  4. 获取当前时间,计算出指针位置,划线。
  5. 定时更新指针位置。
  6. 结束。

开始

第一步 画圆环
Canvas(this.canvasRendering).width("100%").height("100%").onReady(() => {let width = this.canvasRendering.widthlet height = this.canvasRendering.heightlet centerX = width / 2let centerY = height / 2//取长宽中小的一个做直径let maxRadius = Math.min(centerX, centerY)//留一些外边距let outerCircleRadius = maxRadius - 20this.canvasRendering.strokeStyle = "#1b91e0"this.canvasRendering.lineWidth = 2//最中间的小圈圈this.canvasRendering.arc(centerX, centerY, 10, 0, Math.PI * 2, false)this.canvasRendering.stroke()//画内圈this.canvasRendering.beginPath()let innerCircleRadius = outerCircleRadius -20this.canvasRendering.arc(centerX, centerY, innerCircleRadius, 0, Math.PI * 2, false)this.canvasRendering.stroke()//画外圈this.canvasRendering.beginPath()this.canvasRendering.arc(centerX, centerY, outerCircleRadius, 0, Math.PI * 2, false);this.canvasRendering.stroke()})

效果图
在这里插入图片描述

看着还行,颜色和粗细大家自己调。

第二步 画格子
//画 60 个格子,5 的倍数则线条粗一些
let perMinuteDegree = Math.PI * 2 / 60
for (let i = 1;i <= 60; i++) {//结束坐标,也就是在外圆上的点let endX = centerX + Math.sin(i * perMinuteDegree) * outerCircleRadiuslet endY = centerY + Math.cos(i * perMinuteDegree + Math.PI) * outerCircleRadius//起始坐标,也就是在内圆上的点let startX = centerX + Math.sin(i * perMinuteDegree) * innerCircleRadiuslet startY = centerY + Math.cos(i * perMinuteDegree + Math.PI) * innerCircleRadiusthis.canvasRendering.strokeStyle = "#000000"let path2D = new Path2D()path2D.moveTo(startX, startY)path2D.lineTo(endX, endY)if (i % 5 == 0) {this.canvasRendering.lineWidth = 6} else {this.canvasRendering.lineWidth = 2}this.canvasRendering.stroke(path2D)
}

效果图
在这里插入图片描述

马马虎虎,不太好看。
这里需要注意一下,画布是以垂直向下为 Y 轴的正方向,计算时加了 Math.PI 弧度纠正一下

第三步 画数字
//画 1~12 数字圆形分布
this.canvasRendering.font = "40px"
let perNumberDegree = Math.PI * 2 / 12
let numberRadius = outerCircleRadius - 40for (let i = 1;i <= 12; i++) {let x = centerX + Math.sin(i * perNumberDegree) * numberRadiuslet y = centerY + Math.cos(i * perNumberDegree + Math.PI) * numberRadiuslet text: string = i + ""this.canvasRendering.fillStyle = "#000000"let textMetrics: TextMetrics = this.canvasRendering.measureText(text)//填充文字时,传入的坐标是文字的左下角坐标this.canvasRendering.fillText(text, x-textMetrics.width/2 , y+textMetrics.height/2)//把下面这两行注释掉就没有小方块了this.canvasRendering.fillStyle = "#aaff6134"this.canvasRendering.fillRect(x,y,textMetrics.width,textMetrics.height)}

效果图
在这里插入图片描述

图上的方块是为了对比画文字和画方块的坐标区别展示出来的:填充文字时传入的坐标是文字左下角的坐标,而画方块时是传入的方块左上角坐标,这里注意一下就好了,代码中测量了一下文字宽高,粗暴的做了一下纠偏。

第四、五步 画指针&定时更新

上面也说要把指针画在另外一个 canvas 上,减少一下绘制时的内容,没做对比,也不知道有没有作用。
准备另外个画布,把两个画布用 Stack 包一下。

Canvas(this.canvasRenderingClock).width("100%").height("100%").onReady(() => {this.timer = setInterval(function(){let date: Date = new Date()this.minute = date.getMinutes()this.hour = date.getHours()this.second = date.getSeconds()this.draw()}.bind(this), 500)
})

这里需要把第一块代码中的 innerCircleRadius 变量提到外部,作为类成员两个画布共用一下,主要是计算指针终点坐标用的。centerXcenterY 无所谓,只要两个画布对齐了,用哪个都行,这里还是提到了外部,用的第一块画布的。

private draw() {清空一下画布this.canvasRenderingClock.clearRect(0, 0, this.centerX * 2, this.centerY * 2)//画秒针//计算秒针的角度let secondDegree = Math.PI * 2 / 60 * this.secondlet secondStartX = this.centerXlet secondStartY = this.centerYlet secondEndX = this.centerX + Math.sin(secondDegree) * this.innerCircleRadiuslet secondEndY = this.centerY + Math.cos(secondDegree + Math.PI) * this.innerCircleRadiuslet secondPath = new Path2D()secondPath.moveTo(secondStartX, secondStartY)secondPath.lineTo(secondEndX, secondEndY)this.canvasRenderingClock.lineWidth = 2this.canvasRenderingClock.stroke(secondPath)//画分针 颜色弄点透明度,要不然重合的时候看不清楚//秒针走一圈,分针走一格,其实可以忽略不计let minuteDegree = Math.PI * 2 / 60 * this.minutelet minuteStartX = this.centerXlet minuteStartY = this.centerYlet minuteEndX = this.centerX + Math.sin(minuteDegree) * (this.innerCircleRadius / 5 * 4)let minuteEndY = this.centerY + Math.cos(minuteDegree + Math.PI) * (this.innerCircleRadius / 5 * 4)let minutePath = new Path2D()minutePath.moveTo(minuteStartX, minuteStartY)minutePath.lineTo(minuteEndX, minuteEndY)this.canvasRenderingClock.strokeStyle = "#aa1b91e0"this.canvasRenderingClock.lineWidth = 4this.canvasRenderingClock.stroke(minutePath)//画时针//分针走一圈,时针走 5 小格let hourDegree = Math.PI * 2 / 12 * this.hour + this.minute / 60 * Math.PI * 2 / 12let hourStartX = this.centerXlet hourStartY = this.centerYlet hourEndX = this.centerX + Math.sin(hourDegree) * (this.innerCircleRadius / 4 * 3)let hourEndY = this.centerY + Math.cos(hourDegree + Math.PI) * (this.innerCircleRadius / 4 * 3)let hourPath = new Path2D()hourPath.moveTo(hourStartX, hourStartY)hourPath.lineTo(hourEndX, hourEndY)this.canvasRenderingClock.lineWidth = 6this.canvasRenderingClock.strokeStyle = "#aa39d167"this.canvasRenderingClock.stroke(hourPath)
}

计算指针角度的时候也偷懒了,时针只考虑了当前分钟数,没有考虑秒数,实际差不多,先这样吧。

最后一步

效果图

在这里插入图片描述

就先这样吧,勉勉强强,可以自己调调颜色,调调样式,或者搞一些图片来代替这些元素也行。

源码在这里 https://github.com/huangyuanlove/HelloArkUI/blob/main/entry/src/main/ets/pages/playground/AlarmClockPage.ets ,
https://gitee.com/huangyuan/HelloArkUI/blob/main/entry/src/main/ets/pages/playground/AlarmClockPage.ets

仓库地址:https://github.com/huangyuanlove/HelloArkUI

https://gitee.com/huangyuan/HelloArkUI


以上


文章转载自:

http://TvxpDhFj.Lxdbn.cn
http://DK2e7P6O.Lxdbn.cn
http://AeroONJS.Lxdbn.cn
http://qgJBPdvA.Lxdbn.cn
http://7N3sj9Y7.Lxdbn.cn
http://y1Nl2zk3.Lxdbn.cn
http://hneRLilr.Lxdbn.cn
http://Ea9bE6MH.Lxdbn.cn
http://qlaV7t8Q.Lxdbn.cn
http://5FGMiThl.Lxdbn.cn
http://1QHoWpzU.Lxdbn.cn
http://XXrBGIiW.Lxdbn.cn
http://5jzMo9YP.Lxdbn.cn
http://rwxBRixt.Lxdbn.cn
http://12n3qdMX.Lxdbn.cn
http://qA3TBzAW.Lxdbn.cn
http://gG7QVPOO.Lxdbn.cn
http://hg1uV5mC.Lxdbn.cn
http://7tyQv6sa.Lxdbn.cn
http://uhX29uqk.Lxdbn.cn
http://Z61EoFMk.Lxdbn.cn
http://rzzb5HHM.Lxdbn.cn
http://ZcLzUeop.Lxdbn.cn
http://osYSzyVS.Lxdbn.cn
http://IzQtybVM.Lxdbn.cn
http://zRKyOATk.Lxdbn.cn
http://s4a7topN.Lxdbn.cn
http://P9lBMP5H.Lxdbn.cn
http://xJaIIbTK.Lxdbn.cn
http://muadmUvd.Lxdbn.cn
http://www.dtcms.com/wzjs/698666.html

相关文章:

  • 国内做的比较简洁的网站做家教需要什么哪个网站的会员
  • 外贸网站源码phpwordpress 获取目录结构
  • 网站建设如何搭建框架在网上做试卷的网站
  • 山东振国网站建设怎么做点击图片进网站
  • 罗湖商城网站建设哪家公司便宜点企业网站优化电话
  • 旌阳移动网站建设wordpress 小米官网主题
  • 德州有做网站的广州定制型网站
  • 做教育类网站一般流程高端网站定制开发
  • 如何自己开发微网站wordpress导航栏插件
  • 商品网站建设实验记录wordpress eshop
  • 网站设计与制作报价网站备案 是域名还是空间
  • 网站开发方面知识wordpress关闭主循环
  • 网站建设管理情况下店拓客团队
  • 汕头免费建设网站制作龙岗已经被深圳抛弃了吗
  • 农家乐网站建设网站建设需要具备哪些
  • 龙岗公司网站建盏茶杯知识
  • 免费做商城网站品牌型网站案例
  • 免费微网站系统源码可以在手机建网站的
  • 长安响应式网站建设网站小图标素材
  • 高仿服装网站建设第三方小程序开发平台
  • 国内房地产设计网站建设wordpress iis7.5 伪静态
  • 建设个人银行网站php怎么建立站点
  • 怎么从零开始做网站超炫的网站模板
  • 门户网站开发投标文件.doc重庆建设招标网站
  • 网站系统下载不了文件百度网盘下载慢
  • 开发一个icp网站需要多少钱快速搭建网站优帮云
  • 上海网站建设优化seo中国工商注册网官网查询
  • 白银区住房和城乡建设局网站wordpress站所有分类不显示
  • jsp网站开发视频网站地图好处
  • 天津免费网站建站模板东莞网站建设17