Android仿天猫商品抛物线加入购物车动画

本文实例为大家分享了Android仿天猫加入购物车的具体代码,供大家参考,具体内容如下

先上效果图

实现思路:

首先,我们需要三个Imagview

第一个是原商品图片,  这个图片是布局文件中创建的       我们称作A

第二个是做动画的图片 这个我们是在代码中创建的     我们称作B

第三个是购物车图片   这个图片是布局文件中创建的     我们称作C

接着,我们需要将A图片设置给B

A图片一般是联网获取到的,给Imagview设置图片有两种方式

如果是通过setBackgroundDrawable      那么就通过getBackground()获取到Drawable对象,设置给B

如果是通过setImageDrawable      那么就通过getDrawable()获取到Drawable对象,设置给B

再接着   我们获取到A的位置  作为动画开始的位置     获取到C的位置    作为动画结束的位置

然后 创建动画图层,开始执行动画  

这个动画集合中,包括:   水平位移匀速平移   竖直方向加速平移   缩放动画

最后  一定不要忘了  为我们的动画集合添加监听set.setAnimationListener

动画执行前让Imagview 可见     动画执行后让Imagview 不可见

下边是MainActivity中的代码

public class MainActivity extends Activity {

 private ImageView top;
 private ImageView bottom;
 private ImageView animImageView;
 private ViewGroup anim_mask_layout;// 动画层

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 top = (ImageView) findViewById(R.id.top);
 bottom = (ImageView) findViewById(R.id.bottom);

 }

 public void startAnim(View view) {
 // 记录开始的位置
 int[] startLocation = new int[2];// 一个整型数组,用来存储按钮的在屏幕的X、Y坐标
 top.getLocationInWindow(startLocation);// 这是获取购买按钮的在屏幕的X、Y坐标(这也是动画开始的坐标)

 // 创建要做动画的ImageView
 animImageView = new ImageView(this);

 // 设置animImageView的背景
 Drawable background = top.getBackground();
 Drawable zoomDrawable = zoomDrawable(background, dip2Px(this, 200),
 dip2Px(this, 200));
 animImageView.setBackgroundDrawable(zoomDrawable);

 // 开始执行动画
 setAnim(animImageView, startLocation, top);
 }

 /**
 * 设置动画
 *
 * @param v
 * @param startLocation
 * @param view
 */
 private void setAnim(final View v, int[] startLocation, final View view) {

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

 // 计算位移
 int endX = endLocation[0] - startLocation[0];// 动画位移的X坐标
 int endY = endLocation[1] - startLocation[1];// 动画位移的y坐标
 TranslateAnimation translateAnimationX = new TranslateAnimation(0,
 endX, 0, 0);
 translateAnimationX.setInterpolator(new LinearInterpolator());
 translateAnimationX.setRepeatCount(0);// 动画重复执行的次数
 translateAnimationX.setFillAfter(true);

 TranslateAnimation translateAnimationY = new TranslateAnimation(0, 0,
 0, endY);
 translateAnimationY.setInterpolator(new AccelerateInterpolator());
 translateAnimationY.setRepeatCount(0);// 动画重复执行的次数
 translateAnimationX.setFillAfter(true);

 ScaleAnimation scaleAnimation = new ScaleAnimation(0.6f, 0.1f,0.6f, 0.1f);
 scaleAnimation.setInterpolator(new AccelerateInterpolator());
 scaleAnimation.setRepeatCount(0);// 动画重复执行的次数
 scaleAnimation.setFillAfter(true);

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

 @Override
 public void onAnimationRepeat(Animation animation) {
 }

 // 动画的结束
 @Override
 public void onAnimationEnd(Animation animation) {
 v.setVisibility(View.GONE);
 }
 });
 }

 /**
 * @Description: 创建动画层
 * @param
 * @return void
 * @throws
 */
 private ViewGroup createAnimLayout() {
 ViewGroup rootView = (ViewGroup) ((Activity) this).getWindow()
 .getDecorView();
 LinearLayout animLayout = new LinearLayout(this);
 LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
 LinearLayout.LayoutParams.MATCH_PARENT,
 LinearLayout.LayoutParams.MATCH_PARENT);
 animLayout.setLayoutParams(lp);
 animLayout.setId(Integer.MAX_VALUE);
 animLayout.setBackgroundResource(android.R.color.transparent);
 rootView.addView(animLayout);
 return animLayout;
 }

 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;
 }

 /**
 * 将drawable对象进行指定大小的缩放
 *
 * @param drawable
 * @param w
 * @param h
 * @return
 */
 public Drawable zoomDrawable(Drawable drawable, int w, int h) {
 int width = drawable.getIntrinsicWidth();
 int height = drawable.getIntrinsicHeight();
 Bitmap oldbmp = drawableToBitmap(drawable); // drawable 转换成 bitmap
 Matrix matrix = new Matrix(); // 创建操作图片用的 Matrix 对象
 float scaleWidth = ((float) w / width); // 计算缩放比例
 float scaleHeight = ((float) h / height);
 matrix.postScale(scaleWidth, scaleHeight); // 设置缩放比例
 Bitmap newbmp = Bitmap.createBitmap(oldbmp, 0, 0, width, height,
 matrix, true); // 建立新的 bitmap ,其内容是对原 bitmap 的缩放后的图
 return new BitmapDrawable(newbmp); // 把 bitmap 转换成 drawable 并返回
 }

 /**
 * 将drawable 转换成 bitmap
 *
 * @param drawable
 * @return
 */
 public Bitmap drawableToBitmap(Drawable drawable) {
 int width = drawable.getIntrinsicWidth(); // 取 drawable 的长宽
 int height = drawable.getIntrinsicHeight();
 Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
 : Bitmap.Config.RGB_565; // 取 drawable 的颜色格式
 Bitmap bitmap = Bitmap.createBitmap(width, height, config); // 建立对应
   // bitmap
 Canvas canvas = new Canvas(bitmap); // 建立对应 bitmap 的画布
 drawable.setBounds(0, 0, width, height);
 drawable.draw(canvas); // 把 drawable 内容画到画布中
 return bitmap;
 }

 // dp转换为像素px
 public static int dip2Px(Context context, float dp) {
 final float scale = context.getResources().getDisplayMetrics().density;
 return (int) (dp * scale + 0.5f);
 }
}

下边是布局文件中代码

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context="${relativePackage}.${activityClass}" >

 <ImageView
 android:id="@+id/top"
 android:layout_width="60dp"
 android:layout_height="60dp"
 android:background="@drawable/cart_product_img"
 android:onClick="startAnim"/>

 <ImageView
 android:id="@+id/bottom"
 android:layout_width="60dp"
 android:layout_height="60dp"
 android:layout_alignParentBottom="true"
 android:layout_alignParentRight="true"
 android:background="@drawable/gouwuche_ico" />

</RelativeLayout>

点击这里下载源码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android实现购物车添加商品动画

    本文实例为大家分享了Android实现购物车添加商品动画的具体代码,供大家参考,具体内容如下 实现需求: 在商品列表页面,从列表Item 添加商品的时候,需要一个动画,仿佛是是往购物车里添加商品. 实现思路: 获取起始点与终点的坐标,利用PathMeasure 绘制贝塞尔曲线: 为点击的Item 商品View 设置属性动画: 监听属性动画的update,改变View 的坐标: 实现效果: 实现中会用到 PathMeasure 类: 我们主要使用它两个方法: 1.获取长度: /** //获取弧线的

  • Android实现的仿淘宝购物车demo示例

    本文实例讲述了Android实现的仿淘宝购物车.分享给大家供大家参考,具体如下: 夏的热情渐渐退去,秋如期而至,丰收的季节,小编继续着实习之路,走着走着,就走到了购物车,逛过淘宝或者是京东的小伙伴都知道购物车里面的宝贝可不止一件,对于爱购物的姑娘来说,购物车里面的商品恐怕是爆满,添加不进去了,以前逛淘宝的时候,小编没有想过要怎么样实现购物车,就知道在哪儿一个劲儿的逛,但是现在不一样了,小编做为一个开发者,想的就是该如何实现,捣鼓了两天的时间,用listview来实现,已经有模有样了,现在小编就来

  • Android实现购物车添加商品特效

    一.引言 以前在饿了么上面订餐的时候,曾经看到过这么一个特效,就是将商品加入订单时,会有一个小球呈抛物线状落入购物车中,然后购物车中的数量会改变.具体的效果如下图. 效果很简单,就是一个抛物线的动画,那么我们应该用什么技术来实现呢?想了想,动画层是不个错的选择!下面开始分析及实现 二.分析 当点击购买按钮的时候,我们在布局上加入一个动画层,然后让小球在动画层上做抛物线运动,就可实现上图中的效果了. 说到做抛物线运动,当然需要数学上的一点小知识. 抛物线的原理很简单,其实就是X轴方向保持匀速线性运

  • Android使用动画动态添加商品进购物车

    本文实例为大家分享了Android添加商品进购物车的具体代码,供大家参考,具体内容如下 1.首先展示下效果图 2.讲一下思路,小球由加号位置运动到购物车位置,首先得获得这两个点在整个屏幕中的坐标,然后分别计算这两个点的横纵坐标的差值,再通过TranslateAnimation这个类设置小球在X.Y方向上的偏移量,最后通过AnimationSet这个类将这两个动画放在一起执行.这是小球运动的动画,还有就是购物车变大缩小的动画.这个动画通过ObjectAnimator的ofFloat的方法设置缩放,

  • Android实现添加商品到购物车动画效果

    本文实例为大家分享了Android添加商品到购物车的具体代码,供大家参考,具体内容如下 实现需求 在商品列表页面中,从列表item添加商品时,实现一个动画,给人感觉像是在添加商品到购物车. 思路 1.获取各个动画执行对象的起点和终点的坐标,利用PathMeasure绘制绘制贝塞尔曲线: 2.为商品图片设置属性动画: 3.为动画设置addUpdateListene监听器,更新view的坐标. 效果图: MainActivity.java package com.zlw.yzm.demo; impo

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

    当我们写商城类的项目的时候,一般都会有加入购物车的功能,加入购物车的时候会有一些抛物线动画,具体代码如下: 实现效果如图: 思路: 确定动画的起终点 在起终点之间使用二次贝塞尔曲线填充起终点之间的点的轨迹 设置属性动画,ValueAnimator插值器,获取中间点的坐标 将执行动画的控件的x.y坐标设为上面得到的中间点坐标 开启属性动画 当动画结束时的操作 难点: PathMeasure的使用 - getLength() - boolean getPosTan(float distance, f

  • Android中实现淘宝购物车RecyclerView或LIstView的嵌套选择的逻辑

    使用了RecyclerView嵌套RecyclerView的方案. 购物车的第一个界面为RecyclerView,每个Item里面包含一个店铺.在Item中使用RecyclerView包含店铺和店铺的多个商品. 实现思路: 使用接口回调将第二个adapter的商品选择的监听事件回调给第一个adapter后再在第一个adapter中回调给MainActivity. 使用接口回调将第一个adapter的商品选择的监听事件回调给MainActivity. 在MainActivity中处理第一个adap

  • Android实现仿淘宝购物车增加和减少商品数量功能demo示例

    本文实例讲述了Android实现仿淘宝购物车增加和减少商品数量功能.分享给大家供大家参考,具体如下: 在前面一篇<Android实现的仿淘宝购物车demo示例>中,小编简单的介绍了如何使用listview来实现购物车,但是仅仅是简单的实现了列表的功能,随之而来一个新的问题,买商品的时候,我们可能不止想买一件商品,想买多个,或许有因为某种原因点错了,本来想买一件来着,小手不小心抖了一下,把数量错点成了三个,这个时候就涉及到一个新的功能,那就是增加和减少商品的数量,今天这篇博文,小编就来和小伙伴们

  • Android实现购物车功能

    最近看了一些淘宝购物车的demo,于是也写了一个. 效果图如下: 主要代码如下: actvity中的代码: public class ShoppingCartActivity extends BaseActivity { private List<Test> data; private ListView mListView; private ShoppingCartAdapter adapter; private RelativeLayout rlRefresh; private TextVi

  • Android仿天猫商品抛物线加入购物车动画

    本文实例为大家分享了Android仿天猫加入购物车的具体代码,供大家参考,具体内容如下 先上效果图 实现思路: 首先,我们需要三个Imagview 第一个是原商品图片,  这个图片是布局文件中创建的       我们称作A 第二个是做动画的图片 这个我们是在代码中创建的     我们称作B 第三个是购物车图片   这个图片是布局文件中创建的     我们称作C 接着,我们需要将A图片设置给B A图片一般是联网获取到的,给Imagview设置图片有两种方式 如果是通过setBackgroundDr

  • js实现商品抛物线加入购物车特效

    本文实例为大家分享了js实现商品抛物线加入购物车动画代码,供大家参考,具体内容如下 parapola.js /*! * by zhangxinxu(.com) 2012-12-27 * you can visit http://www.zhangxinxu.com/wordpress/?p=3855 to get more infomation * under MIT license */ var funParabola = function(element, target, options)

  • Android仿支付宝中余额宝的数字动画效果

    实现效果图: 下面是具体代码,可直接复制: package com.lcw.rabbit.widget; import android.animation.ObjectAnimator; import android.content.Context; import android.text.TextUtils; import android.util.AttributeSet; import android.view.animation.AccelerateDecelerateInterpola

  • Android仿支付宝笑脸刷新加载动画的实现代码

    看到支付宝的下拉刷新有一个笑脸的动画,因此自己也动手实现一下.效果图如下: 一.总体思路 1.静态部分的笑脸. 这一部分的笑脸就是一个半圆弧,加上两颗眼睛,这部分比较简单,用于一开始的展示. 2.动态笑脸的实现. 2.1.先是从底部有一个圆形在运动,运动在左眼位置时把左眼给绘制,同时圆形继续运动,运动到右眼位置时绘制右眼,圆形继续运动到最右边的位置. 2.2.当上面的圆形运动到最右边时候,开始不断绘制脸,从右向左,脸不断增长,这里脸设置为接近半个圆形的大小. 2.3.当脸画完的时候,开始让脸旋转

  • android仿爱奇艺加载动画实例

    本篇文章介绍了android仿爱奇艺加载动画实例,具体代码如下: 效果图: 用到的知识点: Path ValueAnimator 如果对Path和ValueAnimator还不熟悉推荐去看这几个大神的Blog自定义view的目前讲的最适合我的文章 ,自定义view的详细教程和实践,这个也是教程和实践,感谢他们的付出!(希望大家可以认真看完,可以得到很多启发). 拆解动画 一个圆先顺时针的慢慢画出来(圆不是一个闭合的圆) 这一步是一个组合动画,圆慢慢的消失,同时三角形顺时针旋转 这里的难点主要就是

  • Android仿视频加载旋转小球动画效果的实例代码

    先上个效果图,以免大家跑错地了. 嗯,除了只能录三秒,其他没啥问题. 下面分析一下怎么实现上面这个效果. 理性分析后我们可以看到是几个小球绕着一个圆进行运动,那这里面的重点我们看看什么. 绘制五个球,没什么难度,让球绕圆进行运动,这个好像我们没有见到是怎么去实现了,那下就说这个. 从本质上看,球绕圆运动,其实我们可以看作是一个物体绕指定的路劲运动,那我们就有下面几个东西需要说一下: 1:Path 2:ValueAnimator 3:PathMeasure 前两个大家应该都见过,一个是路径,就是可

  • Android仿天猫横向滑动指示器功能的实现

    Android开发中会有很多很新奇的交互,比如天猫商城的首页头部的分类,使用的是GridLayoutManager+横向指示器实现的,效果如下图. 那对于这种效果要如何实现呢?最简单的方式就是使用RecyclerView+GridLayoutManager,我们知道RecyclerView可以实现九宫格,接下来就是通过RecyclerView控制指示器的显示位置,逻辑实现如下: 计算出RecyclerView划出屏幕的距离w1和剩余宽度w2的比例y,y = w1 / (总宽度w3 - 可使视区域

  • android仿京东商品属性筛选功能

    筛选和属性选择是目前非常常用的功能模块:几乎所有的APP中都会使用: 点击筛选按钮会弹出一个自己封装好的popupWindow,实用方法非常简单:两行代码直接显示:(当然初始化数据除外) 这里和以前用到的流式布局有些不一样:流式布局 以前使用的是单个分类,而且也没有在项目中大量实用:这个筛选功能除了数据外几乎都是从项目中Copy出来的: 整个popupWindow布局就是一个自定义的ListView,这个自定义的listview主要是控制listview的高度: 如果数据少的话就是自适应,如果数

  • Android仿饿了么加入购物车旋转控件自带闪转腾挪动画的按钮效果(实例详解)

    概述 在上文,酷炫Path动画已经预告了,今天给大家带来的是利用 纯自定义View,实现的仿饿了么加入购物车控件,自带闪转腾挪动画的按钮. 效果图如下: 图1 项目中使用的效果,考虑到了View的回收复用, 并且可以看到在RecyclerView中使用,切换LayoutManager也是没有问题的, 图2 Demo效果,测试各种属性值 注意,本控件非继承自ViewGroup,而是纯自定义View实现.理由如下: 1 减少布局层级,从而提高性能 2 文字和图形纯draw,用到什么draw什么,没有

  • Android仿ViVO X6 极速闪充动画效果

    一直都在看自定义View,经过一个星期的坚持,基本上能够写出一些比较实用的控件效果了,今天天气太热,就待在家里玩手机,然后手机没电了,在充电的时候,看到了手机的充电动画,觉得挺酷,然后自己我就仔细的分析了一下这里的动画内容,就觉得,这个我也能写出来,所以就有了这篇博客.纯属原创. 先看看效果,因为图片的原因,只能看到静态的. 这个就是效果图了.当然了,这么看好像不怎么样,但是配上了动画,还是挺好看的. 自定义控件的话,其实做的多了,运用的多了,就会觉得自定义View,跟在Photo shop 里

随机推荐