android添加购物车动画实现

来源:互联网 发布:金牛考勤软件初始密码 编辑:程序博客网 时间:2024/06/07 09:44

商品列表Adapter

[java] view plain copy
  1.    
  2.    
  3. import android.content.Context;  
  4. import android.graphics.drawable.Drawable;  
  5. import android.view.LayoutInflater;  
  6. import android.view.View;  
  7. import android.view.ViewGroup;  
  8. import android.widget.BaseAdapter;  
  9. import android.widget.Button;  
  10. import android.widget.ImageView;  
  11. import android.widget.LinearLayout;  
  12. /** 
  13.  * 商品列表Adapter 
  14.  * @author antkingwei 
  15.  * 
  16.  */  
  17. public class GoodAdapter extends BaseAdapter{  
  18.     private Context mContext;  
  19.     private LayoutInflater layoutInflater;  
  20.     private HolderClickListener mHolderClickListener;  
  21.     final class ViewHolder {  
  22.         ImageView imgview;  
  23.         Button button;  
  24.     }  
  25.     public GoodAdapter(Context context){  
  26.         this.mContext = context;  
  27.         layoutInflater = LayoutInflater.from(mContext);  
  28.     }  
  29.    
  30.        
  31.     @Override  
  32.     public int getCount() {  
  33.         // TODO Auto-generated method stub  
  34.         return 16;  
  35.     }  
  36.    
  37.     @Override  
  38.     public Object getItem(int position) {  
  39.         // TODO Auto-generated method stub  
  40.         return null;  
  41.     }  
  42.    
  43.     @Override  
  44.     public long getItemId(int position) {  
  45.         // TODO Auto-generated method stub  
  46.         return position;  
  47.     }  
  48.    
  49.     @Override  
  50.     public View getView(int position, View convertView, ViewGroup parent) {  
  51.         // TODO Auto-generated method stub  
  52.         final int selectedId = position;  
  53.         final ViewHolder viewHolder;  
  54.         if(convertView ==null){  
  55.             viewHolder = new ViewHolder();  
  56.             convertView = layoutInflater.inflate(R.layout.adapter_listview, null);  
  57.             viewHolder.imgview = (ImageView)convertView.findViewById(R.id.item_img);  
  58.             viewHolder.button = (Button)convertView.findViewById(R.id.item_button);  
  59.             convertView.setTag(viewHolder);  
  60.         }else{  
  61.             viewHolder =(ViewHolder)convertView.getTag();  
  62.         }  
  63.         viewHolder.button.setOnClickListener(new View.OnClickListener() {  
  64.                
  65.             @Override  
  66.             public void onClick(View v) {  
  67.                 // TODO Auto-generated method stub  
  68.                 if(mHolderClickListener!=null){  
  69.                     int[] start_location = new int[2];  
  70.                     viewHolder.imgview.getLocationInWindow(start_location);//获取点击商品图片的位置  
  71.                     Drawable drawable = viewHolder.imgview.getDrawable();//复制一个新的商品图标  
  72.                     mHolderClickListener.onHolderClick(drawable,start_location);  
  73.                 }  
  74.             }  
  75.         });  
  76.         return convertView;  
  77.     }  
  78.     public void SetOnSetHolderClickListener(HolderClickListener holderClickListener){  
  79.         this.mHolderClickListener = holderClickListener;  
  80.     }  
  81.     public interface HolderClickListener{  
  82.         public void onHolderClick(Drawable drawable,int[] start_location);  
  83.     }  
  84.    
  85. }  

活动类 

[java] view plain copy
  1. package com.example.addshopcart;  
  2. import com.example.addshopcart.GoodAdapter.HolderClickListener;  
  3. import android.os.Bundle;  
  4. import android.os.Handler;  
  5. import android.os.Message;  
  6. import android.app.Activity;  
  7. import android.content.Context;  
  8. import android.graphics.drawable.Drawable;  
  9. import android.view.Menu;  
  10. import android.view.View;  
  11. import android.view.ViewGroup;  
  12. import android.view.animation.Animation;  
  13. import android.view.animation.Animation.AnimationListener;  
  14. import android.view.animation.AnimationSet;  
  15. import android.view.animation.RotateAnimation;  
  16. import android.view.animation.ScaleAnimation;  
  17. import android.view.animation.TranslateAnimation;  
  18. import android.widget.Button;  
  19. import android.widget.FrameLayout;  
  20. import android.widget.ImageView;  
  21. import android.widget.ListView;  
  22. /** 
  23.  *  
  24.  * @author antkingwei 
  25.  * 
  26.  */  
  27. public class MainActivity extends Activity {  
  28.     private ListView listView;  
  29.     private Button cart_btn;  
  30.     private GoodAdapter goodAdapter;  
  31.     //动画时间  
  32.     private int AnimationDuration = 1000;  
  33.     //正在执行的动画数量  
  34.     private int number = 0;  
  35.     //是否完成清理  
  36.     private boolean isClean = false;  
  37.     private FrameLayout animation_viewGroup;  
  38.     private Handler myHandler = new Handler(){  
  39.       public void handleMessage(Message msg){  
  40.           switch(msg.what){  
  41.           case 0:  
  42.               //用来清除动画后留下的垃圾  
  43.               try{  
  44.                   animation_viewGroup.removeAllViews();  
  45.                   }catch(Exception e){  
  46.                          
  47.                   }  
  48.                            
  49.                   isClean = false;  
  50.                      
  51.               break;  
  52.            default:  
  53.                   break;  
  54.           }  
  55.       }  
  56.     };  
  57.     @Override  
  58.     protected void onCreate(Bundle savedInstanceState) {  
  59.         super.onCreate(savedInstanceState);  
  60.         setContentView(R.layout.activity_main);  
  61.         listView = (ListView)this.findViewById(R.id.listview);  
  62.         cart_btn = (Button)this.findViewById(R.id.button);  
  63.         animation_viewGroup = createAnimLayout();  
  64.         goodAdapter = new GoodAdapter(this);  
  65.         goodAdapter.SetOnSetHolderClickListener(new HolderClickListener(){  
  66.    
  67.             @Override  
  68.             public void onHolderClick(Drawable drawable,int[] start_location) {  
  69.                 // TODO Auto-generated method stub  
  70.                  doAnim(drawable,start_location);  
  71.                          
  72.                    
  73.             }  
  74.                
  75.         });  
  76.         listView.setAdapter(goodAdapter);  
  77.     }  
  78.        
  79.     private void doAnim(Drawable drawable,int[] start_location){  
  80.         if(!isClean){  
  81.             setAnim(drawable,start_location);  
  82.         }else{  
  83.             try{  
  84.               animation_viewGroup.removeAllViews();  
  85.               isClean = false;  
  86.               setAnim(drawable,start_location);  
  87.             }catch(Exception e){  
  88.                 e.printStackTrace();  
  89.             }  
  90.             finally{  
  91.                 isClean = true;  
  92.             }  
  93.         }  
  94.     }  
  95.     /** 
  96.      * @Description: 创建动画层 
  97.      * @param 
  98.      * @return void 
  99.      * @throws 
  100.      */  
  101.     private FrameLayout createAnimLayout(){  
  102.         ViewGroup rootView = (ViewGroup)this.getWindow().getDecorView();  
  103.         FrameLayout animLayout = new FrameLayout(this);  
  104.         FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,FrameLayout.LayoutParams.MATCH_PARENT);  
  105.         animLayout.setLayoutParams(lp);  
  106.         animLayout.setBackgroundResource(android.R.color.transparent);  
  107.         rootView.addView(animLayout);  
  108.         return animLayout;  
  109.            
  110.     }  
  111.    
  112.     /** 
  113.      * @deprecated 将要执行动画的view 添加到动画层 
  114.      * @param vg 
  115.      *        动画运行的层 这里是frameLayout 
  116.      * @param view 
  117.      *        要运行动画的View 
  118.      * @param location 
  119.      *        动画的起始位置 
  120.      * @return 
  121.      */  
  122.     private View addViewToAnimLayout(ViewGroup vg,View view,int[] location){  
  123.         int x = location[0];  
  124.         int y = location[1];  
  125.         vg.addView(view);  
  126.         FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(  
  127.                 dip2px(this,90),dip2px(this,90));  
  128.         lp.leftMargin = x;  
  129.         lp.topMargin = y;  
  130.         view.setPadding(5555);  
  131.         view.setLayoutParams(lp);  
  132.            
  133.         return view;  
  134.     }  
  135.     /** 
  136.      * dip,dp转化成px 用来处理不同分辨路的屏幕 
  137.      * @param context 
  138.      * @param dpValue 
  139.      * @return 
  140.      */  
  141.     private int dip2px(Context context,float dpValue){  
  142.         float scale = context.getResources().getDisplayMetrics().density;  
  143.         return (int)(dpValue*scale +0.5f);  
  144.     }  
  145.        
  146.    /** 
  147.     * 动画效果设置 
  148.     * @param drawable 
  149.     *       将要加入购物车的商品 
  150.     * @param start_location 
  151.     *        起始位置 
  152.     */  
  153.    private void setAnim(Drawable drawable,int[] start_location){  
  154.          
  155.          
  156.        Animation mScaleAnimation = new ScaleAnimation(1.5f,0.0f,1.5f,0.0f,Animation.RELATIVE_TO_SELF,0.1f,Animation.RELATIVE_TO_SELF,0.1f);  
  157.        mScaleAnimation.setDuration(AnimationDuration);  
  158.        mScaleAnimation.setFillAfter(true);  
  159.           
  160.    
  161.        final ImageView iview = new ImageView(this);  
  162.        iview.setImageDrawable(drawable);  
  163.        final View view = addViewToAnimLayout(animation_viewGroup,iview,start_location);  
  164.        view.setAlpha(0.6f);  
  165.           
  166.        int[] end_location = new int[2];  
  167.        cart_btn.getLocationInWindow(end_location);  
  168.        int endX = end_location[0];  
  169.        int endY = end_location[1]-start_location[1];  
  170.           
  171.        Animation mTranslateAnimation = new TranslateAnimation(0,endX,0,endY);  
  172.        Animation mRotateAnimation = new RotateAnimation(0180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);  
  173.        mRotateAnimation.setDuration(AnimationDuration);  
  174.        mTranslateAnimation.setDuration(AnimationDuration);  
  175.        AnimationSet mAnimationSet = new AnimationSet(true);  
  176.    
  177.        mAnimationSet.setFillAfter(true);  
  178.        mAnimationSet.addAnimation(mRotateAnimation);  
  179.        mAnimationSet.addAnimation(mScaleAnimation);  
  180.        mAnimationSet.addAnimation(mTranslateAnimation);  
  181.           
  182.        mAnimationSet.setAnimationListener(new AnimationListener(){  
  183.            
  184.         @Override  
  185.         public void onAnimationStart(Animation animation) {  
  186.             // TODO Auto-generated method stub  
  187.             number++;  
  188.         }  
  189.    
  190.         @Override  
  191.         public void onAnimationEnd(Animation animation) {  
  192.             // TODO Auto-generated method stub  
  193.              
  194.             number--;  
  195.             if(number==0){  
  196.                 isClean = true;  
  197.                 myHandler.sendEmptyMessage(0);  
  198.             }  
  199.                
  200.         }  
  201.    
  202.         @Override  
  203.         public void onAnimationRepeat(Animation animation) {  
  204.             // TODO Auto-generated method stub  
  205.                
  206.         }  
  207.               
  208.        });  
  209.        view.startAnimation(mAnimationSet);  
  210.          
  211.    }  
  212.    /** 
  213.     * 内存过低时及时处理动画产生的未处理冗余 
  214.     */  
  215.     @Override  
  216.    public void onLowMemory() {  
  217.     // TODO Auto-generated method stub  
  218.         isClean = true;  
  219.         try{  
  220.             animation_viewGroup.removeAllViews();  
  221.         }catch(Exception e){  
  222.             e.printStackTrace();  
  223.         }  
  224.         isClean = false;  
  225.      super.onLowMemory();  
  226.    }  
  227.        
  228.     @Override  
  229.     public boolean onCreateOptionsMenu(Menu menu) {  
  230.         // Inflate the menu; this adds items to the action bar if it is present.  
  231.         getMenuInflater().inflate(R.menu.main, menu);  
  232.         return true;  
  233.     }  
  234.    
  235. }  

activity_main.xml

[html] view plain copy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     tools:context=".MainActivity" >  
  10.    
  11.     <ListView  
  12.         android:layout_width="match_parent"  
  13.         android:layout_height="match_parent"  
  14.         android:id="@+id/listview"  
  15.         ></ListView>  
  16.     <Button  
  17.         android:layout_alignBottom="@+id/listview"  
  18.         android:layout_centerHorizontal="true"  
  19.         android:layout_width="wrap_content"  
  20.         android:layout_height="wrap_content"  
  21.         android:id="@+id/button"  
  22.         android:text="购物车"  
  23.         />  
  24.    
  25. </RelativeLayout>  

AdapterItem布局

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.      >  
  6.     <ImageView  
  7.         android:id="@+id/item_img"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:src="@drawable/ic_launcher"  
  11.         android:layout_alignParentLeft="true"  
  12.         />  
  13.     <Button  
  14.        android:id="@+id/item_button"  
  15.        android:layout_width="wrap_content"  
  16.        android:layout_height="wrap_content"  
  17.        android:layout_alignParentRight="true"  
  18.        android:text="添加"  
  19.        >  
  20.     </Button>  
  21.    
  22. </RelativeLayout>  
0 0