fix: click判定错误 & 位置不正确

This commit is contained in:
unanmed 2025-02-18 21:13:40 +08:00
parent b448f18616
commit 4b2d94e422
5 changed files with 19 additions and 11 deletions

View File

@ -72,6 +72,7 @@ export interface IActionEvent {
/**
*
* `buttons & MouseType.Left`
*
*/
buttons: number;
/** 触发时是否按下了 alt 键 */

View File

@ -822,6 +822,7 @@ export abstract class RenderItem<E extends ERenderItemEvent = ERenderItemEvent>
}
case ActionType.Down: {
// 记录标识符,用于判定 click
if (!inElement) return false;
if (event.touch) {
this.touchId.add(event.identifier);
} else {
@ -830,6 +831,7 @@ export abstract class RenderItem<E extends ERenderItemEvent = ERenderItemEvent>
break;
}
case ActionType.Click: {
if (!inElement) return false;
if (event.touch) {
if (!this.touchId.has(event.identifier)) {
return false;
@ -878,7 +880,9 @@ export abstract class RenderItem<E extends ERenderItemEvent = ERenderItemEvent>
event: IActionEvent,
transform: Transform
): vec3 {
return transform.untransformed(event.offsetX, event.offsetY);
const x = event.offsetX + this.anchorX * this.width;
const y = event.offsetY + this.anchorY * this.height;
return transform.untransformed(x, y);
}
/**

View File

@ -236,8 +236,8 @@ export class Icon extends RenderItem<EIconEvent> implements IAnimateFrame {
const renderable = this.renderable;
if (!renderable) return;
const [x, y, w, h] = renderable.render[0];
const cw = canvas.width;
const ch = canvas.height;
const cw = this.width;
const ch = this.height;
const frame = this.animate
? RenderItem.animatedFrame % renderable.frame
: 0;

View File

@ -214,7 +214,9 @@ export class MotaRenderer extends Container implements IRenderTreeRoot {
case ActionType.Move:
case ActionType.Enter:
case ActionType.Leave:
case ActionType.Wheel:
case ActionType.Wheel: {
return this.getActiveMouseIdentifier(mouse);
}
case ActionType.Up:
case ActionType.Click: {
const id = this.getActiveMouseIdentifier(mouse);
@ -241,14 +243,16 @@ export class MotaRenderer extends Container implements IRenderTreeRoot {
mouse: MouseType = this.getMouseType(event)
): IActionEvent {
const id = this.getMouseIdentifier(type, mouse);
const x = event.offsetX / core.domStyle.scale;
const y = event.offsetY / core.domStyle.scale;
return {
target: this,
identifier: id,
touch: false,
offsetX: event.offsetX,
offsetY: event.offsetY,
absoluteX: event.offsetX,
absoluteY: event.offsetY,
offsetX: x,
offsetY: y,
absoluteX: x,
absoluteY: y,
type: mouse,
buttons: this.getMouseButtons(event),
altKey: event.altKey,
@ -309,8 +313,8 @@ export class MotaRenderer extends Container implements IRenderTreeRoot {
event: TouchEvent,
rect: DOMRect
): IActionEvent {
const x = touch.clientX - rect.left;
const y = touch.clientY - rect.top;
const x = (touch.clientX - rect.left) / core.domStyle.scale;
const y = (touch.clientY - rect.top) / core.domStyle.scale;
return {
target: this,
identifier: this.getTouchIdentifier(touch, type),

View File

@ -66,7 +66,6 @@ export function create() {
return () => (
<container id="map-draw" {...mapDrawProps}>
<icon icon={50} zIndex={100}></icon>
<layer-group id="layer-main" ex={layerGroupExtends} ref={map}>
<layer layer="bg" zIndex={10}></layer>
<layer layer="bg2" zIndex={20}></layer>