HarmonyOS canvas画图问题
代码如下:
struct MeterView {
// 创建渲染上下文设置和画布渲染上下文
private settings: RenderingContextSettings = new RenderingContextSettings(true)
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
// 定义标记中心、标记范围、显示后缀和当前数值
private markCenter: number = 0;
private markRange: number = 10;
private displaySuffix: string = "";
private _currentNum: number = this.markCenter;
// 定义画布宽度、高度和其它绘制参数
private canvasWidth: number = 0;
private canvasHeight: number = 0;
private padTop: number = 36;
private arcSize: number = 50; // 调整后的弧度大小,上下保持一致
private markTextSize: number = 30;
private displayTextSize: number = 48;
private currentPercent: number = 0;
private percentTo: number = 0;
// 组件构建函数
build() {
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
// 创建画布
Canvas(this.context)
.width('100%')
.height('100%')
.backgroundColor(Color.White)
.onReady(() => {
this.canvasWidth = this.context.width;
this.canvasHeight = this.context.height;
this.onDraw();
})
.borderColor('#5c000000')
.borderStyle(BorderStyle.Solid)
}
.width('100%')
.height('100%')
}
// 绘制函数
onDraw() {
const context = this.context;
context.clearRect(0, 0, this.canvasWidth, this.canvasHeight);
const moveDown = this.canvasHeight / 4;
// 界面上部绘制
context.fillStyle = '#D3D3D3'; // 浅灰色
context.beginPath();
context.moveTo(0, 0);
context.lineTo(0, this.padTop + moveDown);
context.quadraticCurveTo(this.canvasWidth / 2, this.padTop - this.arcSize + moveDown, this.canvasWidth,
this.padTop + moveDown);
context.lineTo(this.canvasWidth, 0);
context.closePath();
context.fill(); // 绿色长刻度线绘制
context.save();
context.translate(this.canvasWidth / 2, this.padTop + moveDown);
context.strokeStyle = '#00FF00'; // 绿色
context.lineWidth = 3;
for (let i = -3; i <= 3; i++) {
const angle = i * (Math.PI / 6); // 每个刻度的角度
const x1 = this.arcSize * Math.cos(angle); // 起点的x坐标
const y1 = this.arcSize * Math.sin(angle); // 起点的y坐标
const x2 = (this.arcSize + 10) * Math.cos(angle); // 终点的x坐标
const y2 = (this.arcSize + 10) * Math.sin(angle); // 终点的y坐标
context.beginPath();
context.moveTo(x1, y1);
context.lineTo(x2, y2);
context.stroke();
}
context.restore();
context.save();
context.translate(this.canvasWidth / 2, this.padTop + moveDown);
// 绘制灰色的次刻度线
context.strokeStyle = '#808080'; // 灰色
context.lineWidth = 2;
for (let i = -15; i <= 15; i++) {
if (i % 5 !== 0) {
const angle = i * (Math.PI / 30); // 每个刻度的角度
const x1 = (this.arcSize / 2) * Math.cos(angle); // 起点的x坐标
const y1 = (this.arcSize / 2) * Math.sin(angle); // 起点的y坐标
const x2 = (this.arcSize / 2 + 10) * Math.cos(angle); // 终点的x坐标
const y2 = (this.arcSize / 2 + 10) * Math.sin(angle); // 终点的y坐标
context.beginPath();
context.moveTo(x1, y1);
context.lineTo(x2, y2);
context.stroke();
}
}
context.restore();
}
}
绿色长刻度线和短刻度线,怎么绘画在界面上部那个弧线上均匀分布?
HarmonyOS
赞
收藏 0
回答 1
待解决
相关问题
Canvas里画图的功能是否可以用像素数(px)为单位?
341浏览 • 1回复 待解决
HarmonyOS Canvas绘制image的API相关问题
34浏览 • 1回复 待解决
HarmonyOS Canvas中关于绘制图片问题
403浏览 • 1回复 待解决
在子线程里面高刷调用canvas.drawPixelMapHolderRect;画图,然后模拟机闪退,请请帮帮忙怎么弄?
5626浏览 • 1回复 待解决
HarmonyOS 使用Canvas时发现在重新绘制时有些问题
41浏览 • 1回复 待解决
鸿蒙有很好的画图功能可以使用吗
2542浏览 • 1回复 已解决
HarmonyOS Canvas怎么刷新
86浏览 • 1回复 待解决
HarmonyOS Canvas 实现动画
64浏览 • 1回复 待解决
HarmonyOS Canvas绘制圆角
12浏览 • 1回复 待解决
HarmonyOS Canvas如何重置clip
290浏览 • 1回复 待解决
HarmonyOS Canvas如何设置圆角
55浏览 • 1回复 待解决
HarmonyOS Canvas绘制圆角矩形
26浏览 • 1回复 待解决
HarmonyOS Canvas绘制曲线相关
16浏览 • 1回复 待解决
如何在使用 Canvas 绘制图像时处理像素模糊问题?
189浏览 • 0回复 待解决
HarmonyOS 如何使用Canvas画扇形
22浏览 • 1回复 待解决
HarmonyOS Canvas如何触发重绘
185浏览 • 1回复 待解决
HarmonyOS svg、canvas 的使用详情
498浏览 • 1回复 待解决
HarmonyOS Canvas绘制内容如何更新
39浏览 • 1回复 待解决
HarmonyOS 如何使用canvas绘制虚线
41浏览 • 1回复 待解决
HarmonyOS 环形渐变canvas实现方式
28浏览 • 1回复 待解决
如何操作canvas重新绘制
1116浏览 • 1回复 待解决
canvas 貌似不识别啊?
6700浏览 • 1回复 待解决
The <canvas> component does not exist.
8519浏览 • 3回复 待解决
怎么让Canvas刷新呀?
478浏览 • 1回复 待解决
canvas如何实现水印效果
975浏览 • 1回复 待解决
quadraticCurveTo只是绘制,具体的绘制位置需要自行计算,计算思路弧线所在的圆的方程,然后均分这个弧就行,在均分的位置上画刻度,弧线所在的圆是固定的,也就是圆A的半径是固定的为R。假设弧对应的圆心角是∠o=60°那么对应的弧长就是固定的,弧长l=Π_R_o/180,等分为n等分每份的长度为:Ln = l/n,以屏幕正中间的弧上点为基准(0,R)去计算其它等分点的位置就可以。确定了起始点,再调用Api划线就行。