我又搞了个H5的页面,和小程序的不太一样。
废话不多说,上代码。
bezier.js
function bezier(points,times){ console.log(points) // 0、以3个控制点为例,点A,B,C,AB上设置点D,BC上设置点E,DE连线上设置点F,则最终的贝塞尔曲线是点F的坐标轨迹。 // 1、计算相邻控制点间距。 // 2、根据完成时间,计算每次执行时D在AB方向上移动的距离,E在BC方向上移动的距离。 // 3、时间每递增100ms,则D,E在指定方向上发生位移, F在DE上的位移则可通过AD/AB = DF/DE得出。 // 4、根据DE的正余弦值和DE的值计算出F的坐标。 // 邻控制AB点间距 var bezier_points = []; var points_D = []; var points_E = []; const DIST_AB = Math.sqrt(Math.pow(points[1]['x'] - points[0]['x'], 2) + Math.pow(points[1]['y'] - points[0]['y'], 2)); // 邻控制BC点间距 const DIST_BC = Math.sqrt(Math.pow(points[2]['x'] - points[1]['x'], 2) + Math.pow(points[2]['y'] - points[1]['y'], 2)); // D每次在AB方向上移动的距离 const EACH_MOVE_AD = DIST_AB / times; // E每次在BC方向上移动的距离 const EACH_MOVE_BE = DIST_BC / times; // 点AB的正切 const TAN_AB = (points[1]['y'] - points[0]['y']) / (points[1]['x'] - points[0]['x']); // 点BC的正切 const TAN_BC = (points[2]['y'] - points[1]['y']) / (points[2]['x'] - points[1]['x']); // 点AB的弧度值 const RADIUS_AB = Math.atan(TAN_AB); // 点BC的弧度值 const RADIUS_BC = Math.atan(TAN_BC); // 每次执行 for (var i = 1; i <= times; i++) { // AD的距离 var dist_AD = EACH_MOVE_AD * i; // BE的距离 var dist_BE = EACH_MOVE_BE * i; // D点的坐标 var point_D = {}; if(points[0]['x']<points[1]['x']){ point_D['y'] = dist_AD * Math.sin(RADIUS_AB) + points[0]['y']; point_D['x'] = dist_AD * Math.cos(RADIUS_AB) + points[0]['x']; }else{ point_D['y'] = points[0]['y']- dist_AD * Math.sin(RADIUS_AB); point_D['x'] = points[0]['x']- dist_AD * Math.cos(RADIUS_AB) ; console.log(points[0]['x'] + '.....' + dist_AD*Math.cos(RADIUS_AB)) } points_D.push(point_D); // E点的坐标 var point_E = {}; if (points[0]['x'] < points[1]['x']) { point_E['y'] = dist_BE * Math.sin(RADIUS_BC) + points[1]['y']; point_E['x'] = points[1]['x'] + dist_BE * Math.cos(RADIUS_BC); }else{ point_E['y'] = points[1]['y']-dist_BE * Math.sin(RADIUS_BC); point_E['x'] = points[1]['x'] - dist_BE * Math.cos(RADIUS_BC); } points_E.push(point_E); // 此时线段DE的正切值 var tan_DE = (point_E['y'] - point_D['y']) / (point_E['x'] - point_D['x']); // tan_DE的弧度值 var radius_DE = Math.atan(tan_DE); // 地市DE的间距 var dist_DE = Math.sqrt(Math.pow((point_E['x'] - point_D['x']), 2) + Math.pow((point_E['y'] - point_D['y']), 2)); // 此时DF的距离 var dist_DF = (dist_AD / DIST_AB) * dist_DE; // 此时DF点的坐标 var point_F = {}; // console.log(point_D['x'] +'........'+dist_DF * Math.cos(radius_DE)) if (points[0]['x'] < points[1]['x']) { point_F['y'] = dist_DF * Math.sin(radius_DE) + point_D['y']; point_F['x'] = dist_DF * Math.cos(radius_DE) + point_D['x']; }else{ point_F['y'] = point_D['y'] - dist_DF * Math.sin(radius_DE); point_F['x'] = point_D['x']-dist_DF * Math.cos(radius_DE) ; } bezier_points.push(point_F); } return { 'bezier_points': bezier_points }; } function startAnimation(linePos,width,height) { var index = 0,bezier_points = linePos['bezier_points']; $('.animateImage').css({"visibility":'visible'}) console.log(bezier_points) timer = setInterval(function () { index++; width = width-6; height = height-6; var bus_x=bezier_points[index]['x']-width/2; var bus_y=bezier_points[index]['y']-height/2; console.log(bus_x,bus_y) //更改抛入购物车的图片的大小 $('.animateImage').attr({'width':width,'height':height}) //更改图片位置 $('.animateImage').css({'top':bus_y+'px',"left":bus_x+'px'}) if(index>28){ clearInterval(timer); $('.animateImage').css({"visibility":'hidden'}) } }, 35); }
点击购物车按钮后事件:
$('.buys').click(function(event){ //获取贝塞尔曲线起始点 var e = event; var img = $(this).parent().parent().parent().children().children(img)[0]; //这里是查找加入购物车那个图标上方对应的图片。 var pos = img.getBoundingClientRect(); console.log(pos.top+','+pos.left) imgWidth = pos.width; imgHeight = pos.height; //显示图片 $('.animateImage').attr('src',img.src) var startX = pos.left+pos.width/2; var startY = pos.top+pos.height/2; finger['x']=startX; finger['y']=startY //获取贝塞尔曲线终点 var cart = $('.cart')[0]; console.log(cart) var cartPos = cart.getBoundingClientRect(); var endX = cartPos.left+cartPos.width/2; var endY = cartPos.top+cartPos.height/2; busPos['x'] = endX; busPos['y'] = endY; //计算控制点坐标 if (finger['x'] < busPos['x']) { controlPoint['x'] = Math.abs(busPos['x'] - finger['x']) / 2 + finger['x']; } else { controlPoint['x'] = Math.abs(finger['x'] - busPos['x']) / 2 + busPos['x']; } controlPoint['y'] = finger['y'] - 100; console.log(controlPoint['x'],controlPoint['y']) //finger数组是商品图片中心点对应的坐标 //controlPoint数组是控制点坐标 我选择的是x坐标是起点终点x坐标差的一半+起点x坐标 //busPos数组是购物车坐标,一般都是固定位置的,算出坐标就行了 linePos=bezier([finger,controlPoint,busPos],30) $(".goods_select").removeClass("hide").addClass("show"); $(".all_share").removeClass("hide").addClass("show") });
选完参数点击加入购物车按钮后的代码:
$(".payment-bar").click(function(){ startAnimation(linePos,imgWidth,imgHeight); imgWidth,imgHeiht是商品图片大小 }
html 页面 和 css
<!--购物车--> <div class="cart"> <img src="images/gw.png" /> </div> <!--复制一个商品图片出来,用来移动--> <image class='animateImage' ></image> .cart{ width: 50px; height: 50px; border: 1px solid #DCDCDC; border-radius: 50%; position: fixed; bottom: 100px; right: 30px; display: flex; justify-content: center; align-items: center; background-color: #F5F5F5; box-shadow: 2px 2px 2px #DCDCDC; } .cart img{ width: 30px; height: 30px; } .animateImage{ visibility: hidden; position: fixed; z-index: 9999; }
还是用的之前那篇文章里老兄的算法。
相关推荐
在计算机图形学中,贝塞尔曲线是一种非常重要的数学工具,广泛应用于二维和三维图形的设计与动画制作中。购物车动画的实现,特别是那些流畅、自然的运动效果,往往离不开贝塞尔曲线的运用。贝塞尔曲线因其灵活性和...
贝塞尔曲线在UI设计和动画效果中是一种广泛应用的技术,它能创建平滑、连续的曲线路径,被广泛用于图形绘制和动画制作。在这个场景中,我们利用二阶贝塞尔曲线来实现一个仿美团商品动态添加到购物车的效果。在...
**二次贝塞尔曲线算法详解** 二次贝塞尔曲线是计算机图形学中常用的一种平滑曲线生成方法,它由三个点定义:起始点P0、结束点P2以及一个控制点P1。通过这三个点,我们可以计算出一系列点,这些点连接起来形成的曲线...
根据控制点的数量不同,贝塞尔曲线可以分为线性贝塞尔曲线(一次)、二次贝塞尔曲线、三次贝塞尔曲线等。本文将重点介绍二次贝塞尔曲线及其在C#中的实现方法。 #### 二、二次贝塞尔曲线简介 二次贝塞尔曲线是由三个...
二阶贝塞尔曲线有两个控制点,而三阶(也称为三次贝塞尔曲线)则有三个控制点。每个阶别的贝塞尔曲线都可以通过调整控制点的位置来改变曲线的形状和弯曲度。 在Android中,我们可以使用`Path`类来绘制贝塞尔曲线。`...
路径数据由一系列命令和参数组成,其中`C`(对于三次贝塞尔曲线)或`Q`(对于二次贝塞尔曲线)命令用于定义控制点和结束点。 例如,一个简单的二次贝塞尔曲线可以这样表示: ```javascript var path = document....
这篇关于“C#/WPF二次贝塞尔曲线”的主题将深入探讨二次贝塞尔曲线的概念、参数方程以及如何在C# WPF应用中实现它的绘制。 二次贝塞尔曲线是一种由两个控制点和一个起始点及结束点定义的参数曲线。这种曲线在图形...
在Android中,我们可以使用Path类来绘制贝塞尔曲线,Path.quadTo()方法用于创建二次贝塞尔曲线,而Path.cubicTo()则用于创建三次贝塞尔曲线。这两个方法分别需要两个和三个控制点来确定曲线的形状。 接下来,我们...
java 二次贝塞尔曲线算法,根据起点、终点和控制点输出点集合
贝塞尔曲线(Bezier Curve)是一种在计算机图形学中广泛应用的参数曲线,特别是在二维和三维建模、动画制作、游戏开发以及CAD系统中。它由法国工程师Pierre Bezier于1962年提出,因其简单易用且能够精确地控制曲线...
用TC生存二次贝塞尔曲线,其实稍微改一下就可以实现三次贝塞尔曲线的了。
贝塞尔曲线分为线性、二次、三次及更高次,其中二次和三次贝塞尔曲线在移动控件时最为常用。二次贝塞尔曲线有两个控制点,而三次贝塞尔曲线有三个控制点。通过调整这些点的位置,我们可以精确地控制曲线的形状和弯曲...
以下是如何利用贝塞尔曲线创建“加入购物车”动画的知识点: 1. **基础概念**:首先,了解贝塞尔曲线的基本原理,包括一阶、二阶、三阶以及更高阶的贝塞尔曲线。一阶贝塞尔曲线由两个控制点决定,二阶贝塞尔曲线则...
应用贝塞尔曲线与NSTimer结合使用 制作动态进度条。 简单实用,易懂,易学习 贝塞尔一次二次曲线的简单绘制,应用。 供各位童鞋学习使用分享 Q:305814832 email:ioszhaoyi@163.com
这个示例代码是一个使用 Flet 框架创建的复杂动画自定义模板,展示了一个商品图标沿着贝塞尔曲线飞入购物车图标的特技动画效果。以下是这个示例的优点:直观的动画效果:通过贝塞尔曲线函数创建平滑的动画轨迹,使...
在本文中,我们将深入探讨如何实现“仿美团、饿了么加入购物车的抛物线动画效果”,这一功能常见于许多电商与外卖应用中,为用户界面增添动态美感。我们将主要使用Kotlin语言来实现这一效果,同时也涉及到贝塞尔曲线...
在Android中,主要有两种类型的贝塞尔曲线:线性贝塞尔曲线和二次/三次非线性贝塞尔曲线。线性贝塞尔曲线由两个端点和两个控制点构成,其路径始终是直线。而二次和三次贝塞尔曲线则可以形成更复杂的曲线,它们分别...
根据控制点的数量不同,可以分为线性、二次和三次贝塞尔曲线等。 1. **线性贝塞尔曲线**:最简单的情况,只有两个端点P0和P1。曲线就是连接这两个点的直线段。 2. **二次方贝塞尔曲线**:包含三个控制点P0、P1和P2...
Unity中的贝塞尔曲线是一种强大的工具,常用于游戏开发中的路径规划、动画设计和图形渲染等方面。这个资源包提供了一个方便的方式来创建和控制不同类型的贝塞尔曲线。以下是对每个文件的详细解释: 1. **...
比如,在二维图形中,如果想要连接两条贝塞尔曲线,可以将它们的端点进行线性插值,作为新曲线的中间控制点,以确保连续性。 在编程中实现贝塞尔曲线,通常会用递归方法。对于n阶贝塞尔曲线,可以将其拆分为两个(n-...