购物车特效-贝塞尔曲线动画(点击添加按钮,产生抛物线动画效果)(代码片段)

六月JuneJune 六月JuneJune     2022-12-12     170

关键词:

demo效果:




购物车特效原理:

1.从添加按钮获取开始坐标

2.从购物车图标获取结束坐标

3.打气一个视图,添加属性动画ObjectAnimator(缩小),ValueAnimator(路线)

4.动画开始时添加该视图,动画结束删除该视图

5.运动路径使用TypeEvaluator与贝塞尔函数计算


activity布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!--贝塞尔曲线动画自定义控件-->
    <custom.BezierAnim
        android:id="@+id/bezier_anim"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <!--添加按钮-->
    <Button
        android:id="@+id/bt_good"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_margin="10dp"
        android:text="+" />
    <!--购物车-->
    <ImageView
        android:id="@+id/iv_cart"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:src="@drawable/cart91" />
</RelativeLayout>


移动控件布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:orientation="vertical">

    <ImageView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@drawable/coin91" />

</RelativeLayout>

贝塞尔曲线动画的自定义控件编写:

public class BezierAnim extends FrameLayout 
    public BezierAnim(Context context, AttributeSet attrs, int defStyleAttr) 
        super(context, attrs, defStyleAttr);
    

    public BezierAnim(Context context) 
        this(context, null, 0);
    

    public BezierAnim(Context context, AttributeSet attrs) 
        this(context, attrs, 0);
    

    //PointF等价于float[]数组,里面存放的x和y的值 (point相当于int[])
    private PointF mLocation = new PointF();//这样创建出来,里面还没有值

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) 
        super.onLayout(changed, left, top, right, bottom);
        //获取当前父布局在界面的屏幕坐标(也就是父布局左上角坐标)
        int[] layoutLoc = new int[2];
        getLocationInWindow(layoutLoc);
        mLocation.set(layoutLoc[0], layoutLoc[1]);//将父布局左上角的值赋值给mLocation
    

    /**
     * 开始贝塞尔动画
     *
     * @param startView    动画从哪个view开始(+号)
     * @param endView      动画在哪个view结束(购物车)
     * @param layoutIdMove 动画作用的移动控件(钱袋子的布局)
     */
    public void startCartAnim(View startView, View endView, int layoutIdMove) 
        //1,开始位置
        int[] startLoc = new int[2];
        startView.getLocationInWindow(startLoc);//获取当前view在屏幕上的坐标
        PointF startF = new PointF(startLoc[0] - mLocation.x, startLoc[1] - mLocation.y);//得到当前view相对于父布局左上角位置的坐标
        // 2,结束位置
        int[] endLoc = new int[2];
        endView.getLocationInWindow(endLoc);
        final PointF endF = new PointF(endLoc[0] - mLocation.x, endLoc[1] - mLocation.y);
        //3.移动控件。inflate()参数:作用布局,参考布局,false
        final View moveView = LayoutInflater.from(getContext()).inflate(layoutIdMove, this, false);
        //开始动画  使用属性动画合集
        AnimatorSet set = new AnimatorSet();
        //缩小动画
        ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(moveView, "scaleX", 1.0f, 0.1f);
        ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(moveView, "scaleY", 1.0f, 0.1f);
        //路径动画(baisaier曲线路径,开始坐标,结束坐标)
        ValueAnimator pathAnim = ObjectAnimator.ofObject(beisaier, startF, endF);
        pathAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() 
            @Override
            public void onAnimationUpdate(ValueAnimator animation) 
                //更新坐标
                PointF newPointF = (PointF) animation.getAnimatedValue();
                moveView.setX(newPointF.x);
                moveView.setY(newPointF.y);
            
        );
        //将这些动画放入集合中
        set.playTogether(scaleXAnim, scaleYAnim, pathAnim);
        Animator.AnimatorListener listener = new Animator.AnimatorListener() 
            @Override
            public void onAnimationStart(Animator animation) 
                BezierAnim.this.addView(moveView);//加入动画作用的控件
            

            @Override
            public void onAnimationEnd(Animator animation) 
                BezierAnim.this.removeView(moveView);//移除动画作用的控件
            

            @Override
            public void onAnimationCancel(Animator animation) 

            @Override
            public void onAnimationRepeat(Animator animation) 
        ;
        set.addListener(listener);//动画播放监听器
        set.setDuration(1000);  //运动时间
        set.start();            
    

    //路径计算器
    private TypeEvaluator<PointF> beisaier = new TypeEvaluator<PointF>() 
        @Override
        public PointF evaluate(float fraction, PointF startValue, PointF endValue) 
            //返回变化的轨迹坐标
            PointF newF = new PointF((startValue.x + endValue.x) / 2, 0);//控制点
            return BezierCurve.bezier(fraction, startValue, newF, endValue);
        
    ;


路径计算器:

public class BezierCurve 
    /**
     * 二次贝塞尔曲线插值
     * t:值范围from = 0, to = 1
     */
    public static PointF bezier(float t, PointF point0, PointF point1, PointF point2) 
        float oneMinusT = 1.0f - t;
        PointF point = new PointF();
        point.x = oneMinusT * oneMinusT * point0.x
                + 2 * t * oneMinusT * point1.x
                + t * t * point2.x;
        point.y = oneMinusT * oneMinusT * point0.y
                + 2 * t * oneMinusT * point1.y
                + t * t * point2.y;
        return point;
    

    /**
     * 三次贝塞尔曲线插值
     * t:值范围from = 0, to = 1
     */
    public static PointF bezier(float t, PointF point0, PointF point1, PointF point2, PointF point3) 
        float oneMinusT = 1.0f - t;
        PointF point = new PointF();
        point.x = oneMinusT * oneMinusT * oneMinusT * (point0.x)
                + 3 * oneMinusT * oneMinusT * t * (point1.x)
                + 3 * oneMinusT * t * t * (point2.x)
                + t * t * t * (point3.x);

        point.y = oneMinusT * oneMinusT * oneMinusT * (point0.y)
                + 3 * oneMinusT * oneMinusT * t * (point1.y)
                + 3 * oneMinusT * t * t * (point2.y)
                + t * t * t * (point3.y);
        return point;
    

activity开始动画:

public class CartBazierActivity extends Activity 
    @InjectView(R.id.bt_good)
    Button btGood;
    @InjectView(R.id.iv_cart)
    ImageView ivCart;
    @InjectView(R.id.bezier_anim)
    BezierAnim bezierAnim;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cart_bezier);
        ButterKnife.inject(this);
    

    @OnClick(R.id.bt_good)
    public void bezierMove() 
        Toast.makeText(this, "添加了一件商品", Toast.LENGTH_SHORT).show();
        bezierAnim.startCartAnim(btGood, ivCart, R.layout.moveview);
    

若是startView和endView不在一个界面,可以用EventBus传值


更多:http://www.jb51.net/article/95991.htm



【css动画】饿了么加入购物车抛物线动画实现

...肥宅,手动滑稽),或者在淘宝购物的时候,将商品加入购物车时会有一个很炫酷的动画,如下图饿了么点餐动画:所以百度了一下前端使用css实现这个效果,然后就自己就照葫芦画瓢的写了一个小小的demo,完全当作学习了一... 查看详情

把商品添加到购物车的动画效果(贝塞尔曲线)

目录(?)[+]如图:参考:Android补间动画,属性动画实现购物车添加动画思路:确定动画的起终点在起终点之间使用二次贝塞尔曲线填充起终点之间的点的轨迹设置属性动画,ValueAnimator插值器,获取中间点的坐标将执行动画的控件... 查看详情

贝塞尔曲线实现的购物车添加商品动画效果

效果图如下:1.activity_main.xml<?xmlversion="1.0"encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/rly_bezier_curve_shopping_cart"android:l 查看详情

css贝塞尔曲线模仿饿了么购物车小球动画

在线观看贝塞尔曲线值:传送门在线观看动画效果:传送门代码:<!DOCTYPEhtml><html><head><metacharset="utf-8"><metaname="viewport"content="width=device-width"><title>JSBin</title><style> 查看详情

安卓自定义view仿小米商城购物车动画

通过自定义View与ViewGroup实现小米商城购物车效果用到的知识点自定义View自定义ViewGroup贝塞尔曲线原理通过贝塞尔曲线实现商品抛入购物车的路径自定义ViewGroup实现添加多个商品进购物车的动画自定义View绘制心以及购物车图案代... 查看详情

安卓自定义view仿小米商城购物车动画

通过自定义View与ViewGroup实现小米商城购物车效果用到的知识点自定义View自定义ViewGroup贝塞尔曲线原理通过贝塞尔曲线实现商品抛入购物车的路径自定义ViewGroup实现添加多个商品进购物车的动画自定义View绘制心以及购物车图案代... 查看详情

jquery模拟实现天猫购物车动画效果

...述:  1、点击购买按钮,模拟抛物线将物品弹到购物车里;  2、购物车添加物品后,显示+1动画;效果图如下: 实现如下:  1、导入jquery相关的包:<scripttype="text/javascript"src="jquery-2.1.1.min.js"></scr 查看详情

js加入购物车抛物线动画

天猫将商品加入购物车会有一个抛物线动画,告诉用户操作成功以及购物车的位置,业务中需要用到类似的效果,记录一下实现过程备忘,先上demo 一开始没有想到用抛物线函数去做,也已经忘记还有这么个函数了,想着抛... 查看详情

通用购物车抛物线动画

说明: 之前用vuecss3写过抛物线动画,但是小程序中,不支持js操作dom元素,所以你无法用js去去除动画的css3,导致你无法进行第二次的动画。所以,只能用纯js去计算运动的路线,再改变小球的位置,这个写法,估计是没有什... 查看详情

focusky教程|如何使用变体特效?

Focusky(也称为“FS软件”)的变体特效可以使图形呈动态变化,清晰地演示图形的变化过程,如变成圆形、圆角星、心形等等。具体操作步骤如下: 1.点击右侧工具栏的“图形”按钮,选择“变体”并选择其中一个变体图形... 查看详情

贝塞尔曲线实现购物车飞入效果(代码片段)

...www.demodashi.com/demo/12618.html前言做了一个模仿添加物品飞入购物车效果的例子,下面来讲讲它的简单使用将涉及到以下内容:工具类的使用项目结构图与效果图程序设计与实现一.工具类设计工具类比较多代码,这里就不每个都贴... 查看详情

购物车抛物线

代码$(".cart-increase")是添加按钮domShopCart购物车dom functionbindEvent(){$(".cart-increase").on("click",function(){var__this=$(this);varnStartX=__this.offset().left,nStartY=__this.offset().top,nEndX=domSh 查看详情

tween缓动动画(代码片段)

在讲tween类之前,不得不提的是贝塞尔曲线了。首先,贝塞尔曲线是指依据四个位置任意的点坐标绘制出的一条光滑曲线。它在作图工具或动画中中运用得比较多,例如PS中的钢笔工具,firework中的画笔等等。无论运用在哪里,它... 查看详情

android自定义控件demo集合

...完成,俗称占个坑~持续更新中…github地址饿了么加入购物车按钮仿支付宝支付成功动画波浪效果进度条(正弦函数实现+贝塞尔曲线实现)竖排文字多功能按钮RoundLoadingView可自定义圆角、正常/点击/不可用时的背景... 查看详情

focusky教程|自定义动画运动路径

...件”)中,除了可以应用软件里自带的动画效果,如进入特效,强调特效,退出特效,还可以自定义一个对象由一个点按照一定的轨迹运动到另一点。 操作步骤如下: 1点击“动画”进入动画编辑页面。 【图1▲】&nbs... 查看详情

canvas抛物线运动轨迹

本来是想做一个贝塞尔曲线运动轨迹的公式太复杂了,懒得算,公式在最后我先画了一个抛物线,我确定了两个点,起点(0,0),终点(200,200)用坐标系可算出方程y=-0.005x^2现在找出终点的切线与X轴的交点,那个就是贝塞尔曲... 查看详情

实战演练!二阶贝塞尔仿微信扔炸弹动画(代码片段)

...;奈何没有人家那技术,只能找一张动画来凑合。二阶贝塞尔曲线抛物线在这里是通过二阶贝塞尔曲线来完成,所以先来了解下什么是二阶贝塞尔曲线,从下图中可以发现,二阶贝塞尔曲线有三个关键点,我们... 查看详情

uni-app小程序实现添加购物车抛物线掉入效果(代码片段)

...实跟H5的无差;获取当前抛物线起始位置的坐标获取购物车图标的坐标通过创建一个图标从起始坐标点到终止坐标点的动画效果(延时一秒),这样就造成一个抛物线的假象了。上代码:其中animationElStatus是需... 查看详情