技术标签: 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;
}
主要的实现就是这样了。大家也可以根据这个案例做一些改进,就可以做出其他的效果。
各位如果喜欢的话,可以留个言 点个赞~!
转载自:机器学习算法与Python实践这个系列主要是参考《机器学习实战》这本书。因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学习算法。恰好遇见这本同样定位的书籍,所以就参考这本书的过程来学习了。 这节学习的是逻辑回归(Logistic Regression),也算进入了比较正统的机器学习算法。啥叫
通过该系统,可实现贷款卡的发放、年审、暂停使用、注销等操作。系统介绍:是指依托已有的人行与商业银行之间的网络平台和清算渠道,利用信息和网络技术,通过财政、税务、海关、商业银行(信用社)接口,进行财、税(海关)、库、行信息交换和业务处理,并对信息实行集中存储和管理,提高财政拨款和税款入库速度的系统。BOP报送的数据分三类:基础信息,申报信息和核销信息;业务功能包括:POS签到、POS签退、余额查询、取款、消费、消费冲正、存款、退货、预授权、预授权完成、分期付款、分期付款撤销、积分查询、积分消费、缴费等等。_商业银行核心业务系统内容
简单分析一下PriorityQueue的实现原理提示:开发学习过程中接触到了一个优先队列【PriorityQueue】这样的数据结构,PriorityQueue是使用动态数组来实现最小堆的(默认最小堆,也可以在初始化时传入自己制定的Comparator来把它变成最大堆)总体概述:Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示。#mermaid-svg-b8FWNQL4KXSpb22u .label{font-family:'trebuchet ms', verd_priorityqueue线程安全吗
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电路的暂态响应实验报告分析。实验内容和原理1、零输入响应:指输入为零,初始状态不为零所引起的电路响应。2、零状态响应:指初始状态为零,而输入不为零所产生的电路响应。3、完全响应:指输入与初始状态均不为零时所产生的电路响应。操作方法和实验步骤1、利用Multisim软件仿真,了解电路参数和响应波形之间的关系,并通过虚拟示波器的调节熟悉时域测量的基本操作。2、实际操作实验。积分电..._rc一阶电路实验总结与体会
http://lbsyun.baidu.com/index.php?title=uri/api/web_a标签怎么跳转到百度地图
曾经,brew 是使用root 权限运行的,如今,没有了root 权限,brew安装软件的时候经常会遇到缺少权限的问题。更改权限sudo chown -R $(whoami):admin /usr/local// 第一条运行失败了一半sudo chown -R $(whoami):admin /usr/local/Cellarsudo chown -R $(whoami):adm_brew 权限
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
今天,来学习一下 dokcer 安装搭建最新 gitlab 中文社区版 (搭建一个小型个人的“Gitee” 或 “GitHub”)..._gitlab最新社区版
一、环境准备操作系统版本:centos7 64位hadoop版本:hadoop-2.7.3hbase版本:hbase-1.2.41、机器及角色IP 角色 192.168.11.131 Namenode DFSZKFailoverController ResourceManager Jobhistory ...
import org.springframework.beans.BeanUtils;/*1、前面的参数有值,后面的参数没有值2、后面的参数继承前面的参数*/BeanUtils.copyProperties(ljyyxRjdjhb, myLjyyxRjdjhb);_俩个对象互相拷贝 java
SQL的组成部分DML Data Manipulation Language数据的增删改DDL Data Definition language库或表的增删改DCL Data Control Language用户的创建、授权TCL Transaction Control Language事务控制(Oracle)DQL Data Query Language数据查询(MySQL)...