一、效果图
二、实现方法
参考文章:
支持笔锋效果的手写签字控件_android 写字板如何兼容笔峰-CSDN博客
安卓画笔笔锋的实现探索(一) - 简书
主要代码:
核心思想在于通过插值,在两点之间逐渐绘制多个椭圆,从而呈现出笔锋的效果。
drawLine
方法是一段用于在2D渲染画布上绘制线条并赋予其笔锋效果的代码。
在代码中,`curDis` 用于计算起始点和结束点之间的欧几里德距离。`steps` 根据距离计算出线条上需要绘制的点的数量。`deltaX`, `deltaY`, `deltaW` 分别表示 x 坐标、y 坐标和宽度每一步的增量。
通过 `for` 循环,在两点之间进行插值,绘制多个椭圆,以模拟笔锋效果。每一步循环中,创建一个椭圆对象 (`oval`),并设置其位置调用 `oval` 方法绘制椭圆。
最后,更新坐标和宽度的增量,为绘制下一个椭圆做准备。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| private drawLine(canvas: CanvasRenderingContext2D, x0: number, y0: number, w0: number, x1: number, y1: number, w1: number): void {
const curDis: number = Math.hypot(x0 - x1, y0 - y1);
let steps: number;
steps = 1 + Math.floor(curDis / 2);
let deltaX: number = (x1 - x0) / steps;
let deltaY: number = (y1 - y0) / steps;
let deltaW: number = (w1 - w0) / steps;
let x: number = x0;
let y: number = y0;
let w: number = w0;
for (let i = 0; i < steps; i++) {
const oval: MyRect = new MyRect();
const top: number = y - w / 2.0;
const left: number = x - w / 4.0;
const right: number = x + w / 4.0;
const bottom: number = y + w / 2.0;
oval.set(left, top, right, bottom);
this.oval(canvas, oval);
x += deltaX;
y += deltaY;
w += deltaW;
}
}
|
绘制椭圆的方法,在安卓中可以用canvas.drawOval()方法,在HarmonyOS中需要通过canvas.ellipse()方法来实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| private oval(canvas: CanvasRenderingContext2D, roundedCircleBox: MyRect): void {
canvas.beginPath();
canvas.ellipse(
roundedCircleBox.left + (roundedCircleBox.right - roundedCircleBox.left) / 2,
roundedCircleBox.top + (roundedCircleBox.bottom - roundedCircleBox.top) / 2,
(roundedCircleBox.right - roundedCircleBox.left) / 2,
(roundedCircleBox.bottom - roundedCircleBox.top) / 2,
0,
0,
2 * Math.PI);
canvas.fill();
canvas.closePath();
}
|
三、开源地址
NotePad: HarmonyOS ArkTS带笔锋手写板应用