HarmonyOS使用Canvas自定义绘制内容后,如何根据onTouch事件动态更新绘制的内容?

项目中使用了Canvas组件,结合CanvasRenderingContext2D绘制内容。然后在Canvas.onTouch中编写了触摸事件,根据触摸事件,改变绘制的内容。

HarmonyOS
2024-10-11 12:11:33
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zxjiu

可以使用拖拽手势结合@Watch装饰器实时更新位置绘制内容,Canvas结合手势事件实时更新位置,demo如下:

@Entry  
@Component  
export struct CanvasExample {  
  private settings: RenderingContextSettings = new RenderingContextSettings(true)  
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)  
  @State @Watch('draw') positionXY: number[] = [0, 0];  
  // 原始坐标点  
  prePosition: number[] = [];  
  // 上一次坐标点  
  clickXY: number[] = [];  
  // 鼠标落下坐标点  
  // 偏移参照点  
  shiftingPosition: number[] = [];  
  rectWidth: number = 100;  
  rectHeight: number = 100;  
  PanGestureFlag: boolean = false;  
  build() {  
    Column() {  
      Canvas(this.context)  
        .width('100%')  
        .height('50%')  
        .backgroundColor('#ffff00')  
        .margin({ top: 50 })  
        .onReady(() => {  
          this.draw()  
        })  
        .gesture(  
          // 拖拽手势  
          PanGesture().onActionStart((event: GestureEvent) => {  
            let x = event.fingerList[0].localX;  
            let y = event.fingerList[0].localY;  
            if (x >= this.positionXY[0] && x <= (this.positionXY[0] + this.rectWidth) && y > this.positionXY[1] && y <= (this.positionXY[1] + this.rectHeight)) {  
              this.PanGestureFlag = true;  
              // 可以拖动  
              this.clickXY = [parseInt(`${x}`), parseInt(`${y}`)];  
              this.shiftingPosition = [...this.positionXY];  
              console.info(`shiftingPosition ${this.shiftingPosition}`)  
            }  
          }).onActionUpdate((event: GestureEvent) => {  
            if (this.PanGestureFlag) {  
              this.prePosition = [...this.positionXY];  
              // 保存上一次坐标  
              const x = this.shiftingPosition[0] + parseInt(`${event.offsetX}`);  
              const y = this.shiftingPosition[1] + parseInt(`${event.offsetY}`);  
              this.positionXY = [x, y];  
              console.info(`shiftingPosition ${this.shiftingPosition}`);  
              console.log(`positionXY ${this.positionXY}`);  
            }  
          }).onActionEnd(() => {  
            this.PanGestureFlag = false;  
            // 结束后,停止拖动  
          }))  
    }  
  }  
  draw() {  
    console.log('demoTest :' + 's')  
    if (this.prePosition.length) {  
      this.context.clearRect(this.prePosition[0], this.prePosition[1], this.rectWidth, this.rectHeight);  
    }  
    this.context.fillRect(this.positionXY[0], this.positionXY[1], this.rectWidth, this.rectHeight)  
  }  
}
分享
微博
QQ
微信
回复
2024-10-11 16:14:47
相关问题
Canvas绘制内容如何动态更新
1293浏览 • 1回复 待解决
如何操作canvas重新绘制
929浏览 • 1回复 待解决
bitmap绘制内容需要支持清屏功能
650浏览 • 1回复 待解决
如何使用canvas绘制圆角矩形
380浏览 • 1回复 待解决
Canvas如何触发刷新重复绘制
788浏览 • 1回复 待解决
自定义弹窗大小如何自适应内容
2322浏览 • 1回复 待解决
HarmonyOS Canvas中关于绘制图片问题
183浏览 • 1回复 待解决
canvas怎么绘制资源目录下图片
558浏览 • 1回复 待解决
自定义组件之绘制折线图和曲线图
955浏览 • 1回复 待解决
Canvas如何绘制app.media下面的图片?
2241浏览 • 1回复 待解决