Skip to content

Simulated Interaction

Can be used for automated testing, replaying user actions, and more.

Interact with the engine like operating an input device, automatically triggering composite events. For example, pointerDown followed by pointerUp triggers a tap event, and pointerDown followed by pointerMove triggers a drag event.

If you only want to trigger a simple interaction event, you can use the element’s emit() method.

Key Methods

All simulation methods are available on the leafer.interaction instance.

pointerDown ( data: IPointerEvent )

Press pointer.

pointerMove ( data: IPointerEvent )

Move pointer.

pointerUp ( data?: IPointerEvent )

Release pointer.

zoom ( data: IZoomEvent )

Zoom action.

move ( data: IMoveEvent )

Pan action.

rotate ( data: IRotateEvent )

Rotate action.

Example

Simulate click

Simulate left, middle, and right mouse clicks in sequence, which will automatically trigger a tap event.

ts
// #模拟点击事件
import { Leafer, Rect, PointerButton, PointerEvent } from 'leafer-ui'

const leafer = new Leafer({ view: window })

const rect = new Rect({ x: 100, y: 100, width: 200, height: 200, fill: '#32cd79' })

leafer.add(rect)

rect.on(PointerEvent.DOWN, (e) => {
    console.log('down', e)
    if (e.left) rect.fill = 'blue'
})

rect.on(PointerEvent.TAP, (e) => {
    console.log('tap', e)
    if (e.left) rect.fill = '#32cd79'
})

const { interaction } = leafer

setTimeout(() => {

    interaction.pointerDown({ x: 100, y: 100, buttons: PointerButton.MIDDLE })
    interaction.pointerUp()

    interaction.pointerDown({ x: 100, y: 100, buttons: PointerButton.RIGHT })
    interaction.pointerUp()

    interaction.pointerDown({ x: 100, y: 100 })

    setTimeout(() => {
        interaction.pointerUp({ x: 100, y: 100 })
    }, 500)

}, 1000)

Simulate drag event

ts
// #模拟 drag 事件
import { Leafer, Rect, DragEvent } from 'leafer-ui'

const leafer = new Leafer({ view: window })

const rect = new Rect({ x: 100, y: 100, width: 200, height: 200, fill: '#32cd79', draggable: true })

leafer.add(rect)

rect.on(DragEvent.DRAG, (e) => {
    console.log('drag', e)
})

const { interaction } = leafer

setTimeout(() => {

    interaction.pointerDown({ x: 100, y: 100 })
    interaction.pointerMove({ x: 500, y: 500 }) // drag
    interaction.pointerUp()

}, 1000)

Simulate zoom

ts
// #模拟缩放事件
import { Leafer, Rect, ZoomEvent } from 'leafer-ui'
import '@leafer-in/viewport' // 导入视口插件

const leafer = new Leafer({ view: window, type: 'viewport' })

const rect = new Rect({ x: 100, y: 100, width: 200, height: 200, fill: '#32cd79' })

leafer.add(rect)

rect.on(ZoomEvent.ZOOM, (e) => {
    console.log('zoom', e)
})

const { interaction } = leafer

setTimeout(() => {

    // origin is {x: 100, y: 100}
    interaction.zoom({ x: 100, y: 100, scale: 0.2 })

}, 1000)

Simulate move

ts
// #模拟平移事件
import { Leafer, Rect, MoveEvent } from 'leafer-ui'
import '@leafer-in/viewport' // 导入视口插件

const leafer = new Leafer({ view: window, type: 'viewport' })

const rect = new Rect({ x: 100, y: 100, width: 200, height: 200, fill: '#32cd79' })

leafer.add(rect)

rect.on(MoveEvent.MOVE, (e) => {
    console.log('move', e)
})

const { interaction } = leafer

setTimeout(() => {

    interaction.move({ x: 100, y: 100, moveX: -100, moveY: -100 })

}, 1000)

Simulate rotation

ts
// #模拟旋转事件
import { Leafer, Rect, RotateEvent } from 'leafer-ui'
import '@leafer-in/viewport' // 导入视口插件

const leafer = new Leafer({ view: window, type: 'viewport' })

const rect = new Rect({ x: 100, y: 100, width: 200, height: 200, fill: '#32cd79' })

leafer.add(rect)

rect.on(RotateEvent.ROTATE, (e: RotateEvent) => {
    rect.rotation += e.rotation
    console.log('rotate', e)
})

const { interaction } = leafer

setTimeout(() => {

    // origin is {x: 100, y: 100}
    interaction.rotate({ x: 100, y: 100, rotation: 30 })

}, 1000)
js
// #模拟旋转事件
import { Leafer, Rect, RotateEvent } from 'leafer-ui'
import '@leafer-in/viewport' // 导入视口插件

const leafer = new Leafer({ view: window, type: 'viewport'  })

const rect = new Rect({ x: 100, y: 100, width: 200, height: 200, fill: '#32cd79' })

leafer.add(rect)

rect.on(RotateEvent.ROTATE, (e) => {
    rect.rotation += e.rotation
    console.log('rotate', e)
})

const { interaction } = leafer

setTimeout(() => {

    // origin is {x: 100, y: 100}
    interaction.rotate({ x: 100, y: 100, rotation: 30 })

}, 1000)

Released under the MIT License.