h5,小程序飞入购物车(抛物线绘制运动轨迹点)

简介: 小程序飞入购物车,一次性解决!

前言:最近有朋友在做小程序的过程中,遇到开发过飞入购物车效果的功能的需求。针对这个情况一些网上的demo,多少会有一些不符合情景的问题(bug)存在,针对这一情况小编决定帮朋友写一个方案来帮助解决问题。

思考如果实现 ? 超级简单的!

无论是小程序还是h5飞入购物车无非就是平抛 ,或者是上抛两种情况,对于这两种情况,初中就开始学习抛物线理论知识是完全可以搞定的,高中一年级物理学的自由落体运动,平抛运动就是抛物线理论的具体实现。

平抛运动

上抛运动

构建虚拟直角坐标系,抛物线绘制轨迹点

此方案的本质就是,根据购物车起点和终点,分别做为抛物线的两点,这样一个感念就是要以起始点作为直角坐标系(0,0)方便后续其他坐标点的运算。还有一个应该注意的是,如果是配置了上抛h偏移量 ,就要求最高点(顶点)坐标

此方案均适合 H5 ,小程序


/**
 * 飞入购物车,轨迹点绘制
 * @author  👽
 * @param {Array} start`在这里插入代码片`Point 起点clientX, clientY值 (必要) 
 * @param {Array} endPoint   终点clientX, clientY值 (必要)
 * @param {number} point     点数          (必要) 
 * @param {number} h         抛物线向上高度(上抛运动)  (可选)
 * @param {number} hclientX  当存在h情况下,达到最高点时候的clientX值
 * @return {Array}  [ left ,top ] 值组成的数组
 */
function flycart(startPoint, endPoint, point, h = 0, hclientX) {
   
   
    /* 
    设置startPoint 为(0,0)点 , 此抛物线经过(0,0)点 ,可以推到出模型关系式 y =  ax^2 + bx 或者 y = ax^ 2
    1 当存在 h 的情况,抛物线会y轴向上偏移 h, 此时的关系式 y = ax^2 + bx
    2 当不存在h 的情况 ,抛物线startPoint为顶点, 此时关系式 y = ax^2 
    */

    /* 参数校验 */
    function Validityparameter() {
   
   
        let isOkey = true
        Array.isArray(startPoint) && startPoint.length !== 2 && (isOkey = false)
        Array.isArray(endPoint) && endPoint.length !== 2 && (isOkey = false)
            (point.constructor !== Number) && (isOkey = false)
        return isOkey
    }

    /* 参数验证 */
    if (!Validityparameter()) {
   
   
        return []
    }

    /* A点横坐标 */
    const xA = 0
    /* A点纵坐标 */
    const yA = 0
    /* x轴偏移量 */
    const offsetX = startPoint[0]
    /* y轴偏移量 */
    const offsetY = startPoint[1]
    /* B点横坐标 */
    const xB = endPoint[0] - offsetX
    /* B纵坐标 */
    const yB = endPoint[1] - offsetY

    /* 根据B点坐标和最大高度h求系数a,b 参数*/
    let b = 0
    let a = 0

    /* 计算系数 a ,b */
    function handerComputer() {
   
   
        if (h < 10) {
   
   
            a = yB / Math.pow(xB, 2)
        } else {
   
   
            /* 因为一般购物车的情况都是向下,实际上我们购物车的坐标系是反向的,所以我们这里要把h 设置成负值 */
            h = -h
            /* 一元二次求解a,b ,现在知道一点  ( xB , yB ) 另外一点 ( maxHx,h )  */
            /* 有效达到最高点时候的x坐标 */
            const effectMaHx = hclientX && Math.abs(hclientX - offsetX) > 0 && Math.abs(hclientX - offsetX) < Math.abs(xB)
            /* 如果hclientX不满足要求,则选A , B 中点为   */
            let maxHx = effectMaHx ? (hclientX - offsetX) : (xB + xA) / 2
            /* 已知两点 求 a , b值  根据解方程式解得 y = ax^2 + bx  */
            a = ((yB / xB) - (h / maxHx)) / (xB - maxHx)
            /* 将 a 带入其中一个求解 b */
            b = (yB - a * Math.pow(xB, 2)) / xB
        }
    }


    /* 轨迹数组 */
    const travelList = []
    /* x 均等分 */
    const averageX = (xB - xA) / point

    /* 处理直线运动 */
    function handerLinearMotion(type) {
   
   
        if (type === 'X') {
   
   
            const averageY = (yB - yA) / point
            for (let i = 1; i <= point; i++) {
   
   
                travelList.push([offsetX, i * averageY + offsetY])
            }
        } else {
   
   
            for (let i = 1; i <= point; i++) {
   
   
                travelList.push([offsetX + i * averageX, offsetY])
            }
        }
        return travelList
    }

    /* 当 xB的绝对值小于10的情况,我们看作Y轴直线运功    */
    if (Math.abs(xB) < 10) {
   
   
        return handerLinearMotion('X')
    }
    /*当 yB的绝对值小于10的情况,我们看作x轴直线运功  */
    if (Math.abs(yB) < 10) {
   
   
        return handerLinearMotion('Y')
    }

    handerComputer()
    /* 绘制路径 */
    for (let i = 1; i <= point; i++) {
   
   
        const currentX = averageX * i
        const currentY = Math.pow(currentX, 2) * a + b * currentX - yA
        travelList.push([currentX + offsetX, currentY + offsetY])
    }

    return travelList
}

export default flycart
AI 代码解读

效果

在这里插入图片描述

小程序h5飞入购物车组件?

这里可以把这个方案和组件联系到一起,于是乎飞入购物车组件就搞定了,这里大家要记住的点

1此方案得到的是抛物线各点的left,top值,我们只需要定时改变飞入购物车的图片的left值 ,top就可以

2可以通过计数器功能来改变缩放比,说白了就是改变图片transform:scale值

3不要忘记给图片加上fixed固定定位哦😄😄😄

主要demo方法(仅供参考)

 startCart(){
   
   
    /* 开启购物车 */
    /* this.start 储存起始点 clientY clientY  ,this.end储存最终点 clientX clientY*/
    this.start = {
   
   }
    this.start['x'] = this.data.current['x']
    this.start['y'] = this.data.current['y']
    const travelList = flycart([ this.start['x'] , this.start['y'] ] ,[ this.end['x'] , this.end['y'] ],25,50 )
    this.startAnimate(travelList)
        },
 startAnimate(travelList) {
   
   
    let index = 0
    this.setData({
   
   
        cartHidden: false,
        bus_x: this.start['x'],
        bus_y: this.start['y']
    })
    if(travelList.length===0) return
    this.timer = setInterval( ()=> {
   
   
        index++
        const currentPoint = travelList.shift()
        this.setData({
   
   
            bus_x: currentPoint[0],
            bus_y: currentPoint[1],
            scale: 1 - index / 25
        })
        if (travelList.length === 0) {
   
   
            clearInterval(this.timer)
            this.triggerEvent('close')
        }
    }, 33)
}
AI 代码解读

这里只做了原生小程序飞入购物车组件,h5大致差别不大。

git地址如下

代码地址https://github.com/AlienZhaolin/flycart

谢谢大家鼓励与支持🌹🌹🌹,喜欢的可以给笔者点赞关注,公众号:前端Sharing

目录
打赏
0
0
0
0
170
分享
相关文章
校园圈子系统小程序(圈子论坛、私信聊天、资料共享、二手交易、兼职,跑腿)开源码开发/微信公众号、小程序、H5多端账号同步/搭建多城市的综合社交生活平台
基于开源技术栈构建的校园圈子系统小程序,整合社交与生活服务功能,涵盖兴趣圈子、私信聊天、资料共享、二手交易、兼职跑腿等六大核心模块。通过多端账号同步(微信公众号/小程序/H5),实现数据实时交互,满足学生群体的多元化需求。项目精准锚定校园市场,以“社交+服务”双轮驱动,提供一站式解决方案,支持快速部署与多校区运营,同时具备广告、佣金、会员等多元变现能力,是打造校园生态的理想工具。
99 2
校园圈子系统小程序(圈子论坛、私信聊天、资料共享、二手交易、兼职,跑腿)开源码开发/微信公众号、小程序、H5多端账号同步/搭建多城市的综合社交生活平台
工会成立100周年纪念,开发职工健身AI运动小程序、APP方案推荐
为庆祝中华全国总工会成立100周年,特推出基于AI技术的智能健身系统,以小程序和APP形式呈现,助力职工健康生活。方案包括:1) 小程序插件,支持多种运动识别,开箱即用;2) APP插件,提供更高精度的运动检测;3) 成熟的「AI乐运动」系统,支持赛事活动管理。这些方案满足不同需求,推动全民健身体验升级,彰显工会对职工健康的关怀。
【一步步开发AI运动小程序】二十一、如何将AI运动项目配置持久化到后端?
本文介绍基于云智「Ai运动识别引擎」的运动配置持久化方案,旨在优化小程序或Uni APP中AI运动识别能力。通过将运动检测参数(如`Key`、`Name`、`TickMode`、`rules`或`samples`)持久化到后端,可避免因频繁调整运动参数而重新发布应用,提升用户体验。持久化数据结构支持规则和姿态样本存储,适用于关系数据库、文件或文档数据库(如MongoDB)。此外,云智还提供运动自动适配工具及「AI乐运动」产品,助力快速实现AI体育、全民健身等场景。
【一步步开发AI运动小程序】十八、如何识别用户上传图片中的人体、运动、动作、姿态?
【云智AI运动识别小程序插件】为小程序提供人体、运动及姿态检测的AI能力,本地引擎支持10余种运动,无需后台服务,具备快速、低成本等优势。本文介绍如何通过Canvas方案读取用户上传图片的像素数据,实现人体检测与姿态分析功能,代码简单高效,适合快速集成。更多内容欢迎交流!
【一步步开发AI运动小程序】十九、运动识别中如何解析RGBA帧图片?
本文介绍了如何将相机抽取的RGBA帧图像解析为`.jpg`或`.png`格式,适用于体测、赛事等场景。首先讲解了RGBA图像结构,其为一维数组,每四个元素表示一个像素的颜色与透明度值。接着通过`uni.createOffscreenCanvas()`创建离屏画布以减少绘制干扰,并提供代码实现,将RGBA数据逐像素绘制到画布上生成图片。最后说明了为何不直接使用拍照API及图像转换的调用频率建议,强调应先暂存帧数据,运动结束后再进行转换和上传,以优化性能。
公众号小程序H5网页像素流送UE5模型的方法分享
本文探讨了如何通过像素流送技术在小程序、公众号等平台展示复杂的3D模型(如UE5引擎开发的楼盘模型、数字孪生展厅)。该技术将GPU和CPU算力需求转移到服务器端,使用户侧无需高性能硬件即可流畅体验。通过Webrtc实现实时云渲染,确保毫秒级响应,且兼容多种浏览器。使用点量云流等产品级软件,老项目只需重新打包为EXE格式,即可轻松嵌入H5网页、小程序或公众号中,支持Unity、WebGL等多种3D应用及传统CAD模型。
72 1
【一步步开发AI运动小程序】二十、AI运动小程序如何适配相机全屏模式?
本文探讨了小程序`camera`组件在全屏模式下的适配问题及其解决方案。由于`camera`组件存在预览图像裁切特性,可能导致入镜检测与预览不一致、骨骼图与人体不重合等问题。通过分析其裁剪逻辑(长边按比缩放,短边居中裁切),我们提供了计算裁剪比例和留白的适配方法,并优化了插件特性以支持全屏应用。同时,文章还讨论了全屏模式可能带来的副作用,如人体可视区域变小、检测范围变化及抽帧帧率下降等,并给出了改进建议。该方案适用于云上赛事、健身锻炼、AI体测、AR互动等场景,助力提升用户体验和UI布局合理性。
【一步步开发AI运动小程序】十五、AI运动识别中,如何判断人体站位的远近?
【云智AI运动识别小程序插件】提供人体、运动及姿态检测的AI能力,无需后台支持,具有快速、体验好、易集成等特点。本文介绍如何利用插件判断人体与摄像头的远近,确保人体图像在帧内的比例适中,以优化识别效果。通过`whole`检测规则,分别实现人体过近和过远的判断,并给出相应示例代码。
【一步步开发AI运动小程序】十六、AI运动识别中,如何判断人体站位?
【云智AI运动识别小程序插件】提供人体、运动及姿态检测的AI能力,本地引擎无需后台支持,具备快速、体验好、易集成等优势。本文介绍如何利用插件的`camera-view`功能,通过检测人体站位视角(前、后、左、右),确保运动时的最佳识别率和用户体验。代码示例展示了如何实现视角检查,确保用户正或背对摄像头,为后续运动检测打下基础。
【一步步开发AI运动小程序】十七、如何识别用户上传视频中的人体、运动、动作、姿态?
【云智AI运动识别小程序插件】提供人体、运动、姿态检测的AI能力,支持本地原生识别,无需后台服务,具有速度快、体验好、易集成等优点。本文介绍如何使用该插件实现用户上传视频的运动识别,包括视频解码抽帧和人体识别的实现方法。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等