动画效果第一弹——购物车添加商品特效_aNotFound404的博客-程序员宅基地

技术标签: android开发  特效  Android案例分析  android  动画  购物车  android动画  

(一)引言

以前在饿了么上面订餐的时候,曾经看到过这么一个特效,就是将商品加入订单时,会有一个小球呈抛物线状落入购物车中,然后购物车中的数量会改变。具体的效果如下图。
这里写图片描述

效果很简单 ,就是一个抛物线的动画,那么我们应该用什么技术来实现呢?想了想,动画层是不个错的选择!下面开始分析及实现

(二)分析

当点击购买按钮的时候,我们在布局上加入一个动画层,然后让小球在动画层上做抛物线运动,就可实现上图中的效果了。
说到做抛物线运动,当然需要数学上的一点小知识。 抛物线的原理很简单,其实就是X轴方向保持匀速线性运动,而Y轴做加速度运动就好了。
在android的动画中,可以设置Interpolator属性。 Interpolator 被用来修饰动画效果,定义动画的变化率,可以使存在的动画效果accelerated(加速),decelerated(减速),repeated(重复),bounced(弹跳)等。而我们需要用到的就是LinearInterpolator线性匀速运动和AccelerateInterpolator加速度运动效果。
所以我们只要给小球分别设置X和Y方向上的TranslateAnimation平移动画,在设置相应的Interpolator ,即可实现抛物线效果。

(三)代码实现

关于布局文件和ListView就不必多说了 在最后提供的源码中都可以看到,我们这里主要讲解在动画层上实现抛物线动画的功能。

    holder.buyBtn.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
        // 用来存储按钮的在屏幕的X、Y坐标
        int[] startLocation = new int[2];
// 获取购买按钮的在屏幕的X、Y坐标(这也是动画开始的坐标)      
        v.getLocationInWindow(startLocation);
        //设置小球的图片
        ball = new ImageView(mContext);
        ball.setImageResource(R.drawable.sign);
        setAnim(ball, startLocation);// 开始执行动画
                }
            });

这段代码很简单,就是设置小球的初始坐标,然后开始执行动画。
下面是执行动画的函数。

private void setAnim(final View v, int[] startLocation) {
        anim_mask_layout = null;
        //创建动画层
        anim_mask_layout = createAnimLayout();
        //把动画小球添加到动画层
        anim_mask_layout.addView(v);
    final View view = addViewToAnimLayout(anim_mask_layout, v,startLocation);
        // 存储动画结束位置的X、Y坐标
        int[] endLocation = new int[2];
        // shopCart是购物车
        shopCart.getLocationInWindow(endLocation);

        // 计算位移
        // 动画位移的X坐标
        int endX = 0 - startLocation[0] + 40;
        // 动画位移的y坐标
        int endY = endLocation[1] - startLocation[1];
        //设置X方向上的平移动画
        TranslateAnimation translateAnimationX = new TranslateAnimation(0,
                endX, 0, 0);
        translateAnimationX.setInterpolator(new LinearInterpolator());
        // 动画重复执行的次数
        translateAnimationX.setRepeatCount(0);
        translateAnimationX.setFillAfter(true);
       //设置Y方向上的平移动画
        TranslateAnimation translateAnimationY = new TranslateAnimation(0, 0,
                0, endY);
        translateAnimationY.setInterpolator(new AccelerateInterpolator());
        // 动画重复执行的次数
        translateAnimationY.setRepeatCount(0);
        translateAnimationX.setFillAfter(true);

        AnimationSet set = new AnimationSet(false);
        set.setFillAfter(false);
        set.addAnimation(translateAnimationY);
        set.addAnimation(translateAnimationX);
        set.setDuration(800);// 动画的执行时间
        view.startAnimation(set);
        // 动画监听事件
        set.setAnimationListener(new AnimationListener() {
            // 动画的开始
            @Override
            public void onAnimationStart(Animation animation) {
                v.setVisibility(View.VISIBLE);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                // TODO Auto-generated method stub
            }

            // 动画的结束
            @Override
            public void onAnimationEnd(Animation animation) {
                v.setVisibility(View.GONE);
                buyNum++;//让购买数量加1
                buyNumView.setText(buyNum + "");//
                buyNumView.setBadgePosition(BadgeView.POSITION_TOP_RIGHT);
                buyNumView.show();
            }
        });

    }

buyNumView是github上的一个组件BadgeView.就是那个购物车右上角显示数字的标签,在QQ和微信上都能看到这玩意。
下面是将小球添加到动画层的代码

private View addViewToAnimLayout(final ViewGroup parent, final View view,
            int[] location) {
        int x = location[0];
        int y = location[1];
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
        lp.leftMargin = x;
        lp.topMargin = y;
        view.setLayoutParams(lp);
        return view;
    }

主要的实现就是这样了。大家也可以根据这个案例做一些改进,就可以做出其他的效果。
各位如果喜欢的话,可以留个言 点个赞~!

源码送上

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a253664942/article/details/45157103

智能推荐

机器学习算法与Python实践之逻辑回归(Logistic Regression)-程序员宅基地

转载自:机器学习算法与Python实践这个系列主要是参考《机器学习实战》这本书。因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学习算法。恰好遇见这本同样定位的书籍,所以就参考这本书的过程来学习了。 这节学习的是逻辑回归(Logistic Regression),也算进入了比较正统的机器学习算法。啥叫

商业银行系统体系_商业银行核心业务系统内容-程序员宅基地

通过该系统,可实现贷款卡的发放、年审、暂停使用、注销等操作。系统介绍:是指依托已有的人行与商业银行之间的网络平台和清算渠道,利用信息和网络技术,通过财政、税务、海关、商业银行(信用社)接口,进行财、税(海关)、库、行信息交换和业务处理,并对信息实行集中存储和管理,提高财政拨款和税款入库速度的系统。BOP报送的数据分三类:基础信息,申报信息和核销信息;业务功能包括:POS签到、POS签退、余额查询、取款、消费、消费冲正、存款、退货、预授权、预授权完成、分期付款、分期付款撤销、积分查询、积分消费、缴费等等。_商业银行核心业务系统内容

简单分析一下PriorityQueue_priorityqueue线程安全吗_Sakura小败狗的博客-程序员宅基地

简单分析一下PriorityQueue的实现原理提示:开发学习过程中接触到了一个优先队列【PriorityQueue】这样的数据结构,PriorityQueue是使用动态数组来实现最小堆的(默认最小堆,也可以在初始化时传入自己制定的Comparator来把它变成最大堆)总体概述:Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示。#mermaid-svg-b8FWNQL4KXSpb22u .label{font-family:'trebuchet ms', verd_priorityqueue线程安全吗

纯前端利用 js-xlsx 实现 Excel 文件导入导出功能示例_xlsx.full.min.js导出excel-程序员宅基地

1.导入功能实现下载js-xlsx到dist复制出xlsx.full.min.js引入到页面中然后通过FileReader对象读取文件利用js-xlsx转成json数据代码实现(==>示例<==)<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ..._xlsx.full.min.js导出excel

一阶电路实验报告心得_一阶rc电路的暂态响应实验报告分析-程序员宅基地

本文为大家带来一阶rc电路的暂态响应实验报告分析。实验内容和原理1、零输入响应:指输入为零,初始状态不为零所引起的电路响应。2、零状态响应:指初始状态为零,而输入不为零所产生的电路响应。3、完全响应:指输入与初始状态均不为零时所产生的电路响应。操作方法和实验步骤1、利用Multisim软件仿真,了解电路参数和响应波形之间的关系,并通过虚拟示波器的调节熟悉时域测量的基本操作。2、实际操作实验。积分电..._rc一阶电路实验总结与体会

a标签点击跳转地图的_a标签怎么跳转到百度地图-程序员宅基地

http://lbsyun.baidu.com/index.php?title=uri/api/web_a标签怎么跳转到百度地图

随便推点

mac brew 权限问题解决记录-程序员宅基地

曾经,brew 是使用root 权限运行的,如今,没有了root 权限,brew安装软件的时候经常会遇到缺少权限的问题。更改权限sudo chown -R $(whoami):admin /usr/local// 第一条运行失败了一半sudo chown -R $(whoami):admin /usr/local/Cellarsudo chown -R $(whoami):adm_brew 权限

TensorFlow的几个问题_cannot import name 'cond' from 'tensorflow.python.-程序员宅基地

WARNING:tensorflow:From C:\Users\wb-zjf497303\AppData\Roaming\Python\Python36\site-packages\tensorflow\python\ops\resource_variable_ops.py:435: colocate_with (from tensorflow.python.framework.ops) is ..._cannot import name 'cond' from 'tensorflow.python.ops

【Docker】【GitLab】dokcer 安装搭建最新 gitlab 中文社区版 (搭建一个小型个人的“Gitee” 或 “GitHub”)_gitlab最新社区版_南方者的博客-程序员宅基地

今天,来学习一下 dokcer 安装搭建最新 gitlab 中文社区版 (搭建一个小型个人的“Gitee” 或 “GitHub”)..._gitlab最新社区版

生产环境下hadoop HA集群及Hbase HA集群配置-程序员宅基地

一、环境准备操作系统版本:centos7 64位hadoop版本:hadoop-2.7.3hbase版本:hbase-1.2.41、机器及角色IP 角色 192.168.11.131 Namenode DFSZKFailoverController ResourceManager Jobhistory ...

java中对象与对象之间数据互相copy_俩个对象互相拷贝 java-程序员宅基地

import org.springframework.beans.BeanUtils;/*1、前面的参数有值,后面的参数没有值2、后面的参数继承前面的参数*/BeanUtils.copyProperties(ljyyxRjdjhb, myLjyyxRjdjhb);_俩个对象互相拷贝 java

SQL类型、线程类型、常用端口号、tomcat优化配置、redis持久化方案-程序员宅基地

SQL的组成部分DML Data Manipulation Language数据的增删改DDL Data Definition language库或表的增删改DCL Data Control Language用户的创建、授权TCL Transaction Control Language事务控制(Oracle)DQL Data Query Language数据查询(MySQL)...