Skip to content

getMotionPoint

运动路径上指定位置的 坐标点。

注意事项

需安装 运动路径插件 才能使用。

关键方法

getMotionPoint ( ): IRotationPointData

获取运动路径上指定位置的 坐标点, 返回一个包含 rotation 的 坐标点, 如下:

元素和运动路径元素都支持调用此方法。

ts
interface IRotationPointData {
  x: number
  y: number
  rotation: number
}

示例

ts

import { App, Line, Platform, Path } from 'leafer-ui'
import '@leafer-in/editor' // 图形编辑插件
import '@leafer-in/motion-path' // 运动路径插件
import '@leafer-in/animate' // 动画插件
import '@leafer-in/state' // 按钮状态插件

// 导入龙的路径部件 及 之前采集的飞行路径
import { points, headPath, headWithEyePath, bodyPath, clawLeftPath, clawRightPath, tailPath } from './dragon'


const app = new App({
    view: window,
    editor: {} // 会自动创建 editor实例、tree层、sky层
})

// 加载龙的飞行路径
const line = new Line({ motionPath: true, points }) // 增加 motionPath: true, 设为运动路径
app.tree.add(line)


// --- 第一部分 ---

// 绘制龙

let fill = 'black' // 填充色

/// 1. 头
const head = new Path({
    path: headPath,
    fill,
    around: 'center',
    cursor: 'pointer', // 增加按钮交互效果
    hoverStyle: { scale: 1.2 },
    pressStyle: { scale: 3, transition: 0.5 }
})
app.tree.add(head)

// 2. 爪子
const claws = [
    new Path({ path: clawLeftPath, fill, around: 'center' }),
    new Path({ path: clawRightPath, fill, around: 'center' }),
    new Path({ path: clawLeftPath, fill, around: 'center' }),
    new Path({ path: clawRightPath, fill, around: 'center' }),
]
app.tree.add(claws)

// 3. 身体,多个活动关节
const body: Path[] = []
for (let i = 0; i < 36; i++) {
    let scale = 1
    if (i < 10) scale -= (10 - i) / 30 // 靠近头部收窄
    else if (i > 16) scale -= (i - 16) / 30  // 尾部收窄
    body.push(new Path({ path: bodyPath, fill, scale, around: 'center' }))
}
app.tree.add(body)

// 4. 尾巴
const tail = new Path({ path: tailPath, fill, around: 'center' })
app.tree.add(tail)



// --- 第二部分 ---

// 飞行动画及交互

// 1. 准备飞行数据
const total = line.getMotionTotal() // 飞行的总里程(运动路径的总长度)
let to = 700 // 飞往的位置(距离起点)

function getPosition(position: number): number {
    return position < 0 ? total + position : position // 生成有效的定位位置
}

// 2. 飞行到指定位置,并定位龙的部件
function flyTo(to: number) {
    let position = to

    // 定位头部
    head.set(line.getMotionPoint(position)) // 获取运动路径上的点,然后 set({x, y, rotation})
    position -= 15

    // 定位身体
    body.forEach(item => {
        item.set(line.getMotionPoint(getPosition(position)))
        position -= 30 * item.scaleX * 0.75
    })

    // 定位尾巴
    tail.set(line.getMotionPoint(getPosition(position)))

    // 定位爪子
    const quarter = (position - to) / 4 // 身体长度的 1/4

    position = to + quarter
    claws[0].set(line.getMotionPoint(getPosition(position)))
    claws[1].set(line.getMotionPoint(getPosition(position += 20)))

    position = to + quarter * 3
    claws[2].set(line.getMotionPoint(getPosition(position)))
    claws[3].set(line.getMotionPoint(getPosition(position += 20)))
}


// 3. 循环飞行动画
function animate() {
    to += 8
    if (to > total) to = 0
    flyTo(to)

    Platform.requestRender(animate)
}


// 4.点击头部之后开始飞行动画
head.on('tap', () => {
    head.path = headWithEyePath // 替换带眼睛的龙头路径
    setTimeout(() => {
        animate()
    }, 500)

})


// 设置龙的初始飞行状态
flyTo(to)

Released under the MIT License.