Android之NineOldAndroids实现绚丽的ListView左右滑动删除Item效果

Posted 冰糖葫芦三剑客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android之NineOldAndroids实现绚丽的ListView左右滑动删除Item效果相关的知识,希望对你有一定的参考价值。


    

     今天还是给大家带来自定义控件的编写,自定义一个ListView的左右滑动删除Item的效果,这个效果之前已经实现过了,有兴趣的可以看下Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果,之前使用的是滑动类Scroller来实现的,但是看了下通知栏的左右滑动删除效果,确实很棒,当我们滑动Item超过一半的时候,item的透明度就变成了0,我们就知道抬起手指的时候item就被删除了,当item的透明度不为0的时候,我们抬起手指Item会回到起始位置,这样我们就知道拖动到什么位置item会删除,什么位置Item不删除,用户体验更好了,还有一个效果,就是我们滑动删除了item的时候,ListView的其他item会出现向上或者向下滚动的效果,感觉效果很棒,所以在GitHub上面搜索了下,发现很多开源库都有这个效果,比如ListViewAnimationsandroid-swipelistview等等,我看了下实现原理,使用的是Jake Wharton的动画开源库NineOldAndroids,这个库究竟是干嘛的呢?在API3.0(Honeycomb), SDK新增了一个Android.animation包,里面的类是实现动画效果相关的类,通过Honeycomb API,能够实现非常复杂的动画效果,但是如果开发者想在3.0以下使用这一套API, 则需要使用开源框架Nine Old androids,在这个库中会根据我们运行的机器判断其SDK版本,如果是API3.0以上则使用Android自带的动画类,否则就使用Nine Old Androids库中,这是一个兼容库,接下来我们就来看看这个效果的具体实现吧

实现该效果的主要思路

  1. 先根据手指触摸的点来获取点击的是ListView的哪一个Item
  2. 当手指在屏幕上面滑动的时候,我们要使得Item跟随手指的滑动而滑动
  3. 当我们抬起手指的时候,我们根据滑动的距离或者手指在屏幕上面的速度来判断Item是滑出屏幕还是滑动至其实位置
  4. Item滑出屏幕时,使ListView的其他item产生向上挤压或者向下挤压的效果

大致的思路这是这四步,其中的一些细节接下来我会一一为大家解答的,接下来我们就用代码来实现这种效果吧

首先我们新建一个工程,叫Swipedismisslistview,我们需要将Nine Old Androids这个库引入到工程,大家可以去https://github.com/JakeWharton/NineOldAndroids下载,可以使用Jar包,也可以使用工程库的形式引入到我们自己的工程,我们还需要自定义一个ListView,我们先看代码然后给大家讲解下具体的功能实现

[java]  view plain  copy  
  1. package com.example.swipedismisslistview;  
  2.   
  3. import static com.nineoldandroids.view.ViewHelper.setAlpha;  
  4. import static com.nineoldandroids.view.ViewHelper.setTranslationX;  
  5. import android.content.Context;  
  6. import android.util.AttributeSet;  
  7. import android.view.MotionEvent;  
  8. import android.view.VelocityTracker;  
  9. import android.view.View;  
  10. import android.view.ViewConfiguration;  
  11. import android.view.ViewGroup;  
  12. import android.widget.AdapterView;  
  13. import android.widget.ListView;  
  14.   
  15. import com.nineoldandroids.animation.Animator;  
  16. import com.nineoldandroids.animation.AnimatorListenerAdapter;  
  17. import com.nineoldandroids.animation.ValueAnimator;  
  18. import com.nineoldandroids.view.ViewHelper;  
  19. import com.nineoldandroids.view.ViewPropertyAnimator;  
  20. /** 
  21.  * @blog http://blog.csdn.net/xiaanming 
  22.  *  
  23.  * @author xiaanming 
  24.  * 
  25.  */  
  26. public class SwipeDismissListView extends ListView   
  27.     /** 
  28.      * 认为是用户滑动的最小距离 
  29.      */  
  30.     private int mSlop;  
  31.     /** 
  32.      * 滑动的最小速度 
  33.      */  
  34.     private int mMinFlingVelocity;  
  35.     /** 
  36.      * 滑动的最大速度 
  37.      */  
  38.     private int mMaxFlingVelocity;  
  39.     /** 
  40.      * 执行动画的时间 
  41.      */  
  42.     protected long mAnimationTime = 150;  
  43.     /** 
  44.      * 用来标记用户是否正在滑动中 
  45.      */  
  46.     private boolean mSwiping;  
  47.     /** 
  48.      * 滑动速度检测类 
  49.      */  
  50.     private VelocityTracker mVelocityTracker;  
  51.     /** 
  52.      * 手指按下的position 
  53.      */  
  54.     private int mDownPosition;  
  55.     /** 
  56.      * 按下的item对应的View 
  57.      */  
  58.     private View mDownView;  
  59.     private float mDownX;  
  60.     private float mDownY;  
  61.     /** 
  62.      * item的宽度 
  63.      */  
  64.     private int mViewWidth;  
  65.     /** 
  66.      * 当ListView的Item滑出界面回调的接口 
  67.      */  
  68.     private OnDismissCallback onDismissCallback;  
  69.   
  70.     /** 
  71.      * 设置动画时间 
  72.      *  
  73.      * @param mAnimationTime 
  74.      */  
  75.     public void setmAnimationTime(long mAnimationTime)   
  76.         this.mAnimationTime = mAnimationTime;  
  77.       
  78.   
  79.     /** 
  80.      * 设置删除回调接口 
  81.      *  
  82.      * @param onDismissCallback 
  83.      */  
  84.     public void setOnDismissCallback(OnDismissCallback onDismissCallback)   
  85.         this.onDismissCallback = onDismissCallback;  
  86.       
  87.   
  88.     public SwipeDismissListView(Context context)   
  89.         this(context, null);  
  90.       
  91.   
  92.     public SwipeDismissListView(Context context, AttributeSet attrs)   
  93.         this(context, attrs, 0);  
  94.       
  95.   
  96.     public SwipeDismissListView(Context context, AttributeSet attrs,  
  97.             int defStyle)   
  98.         super(context, attrs, defStyle);  
  99.   
  100. android studio怎么找不到com,nineoldandroids,animation,animatorset

    使用 com.nineoldandroids 库的替代方法是啥

    Android 动画

    Android动画:模拟开关按钮点击打开动画(属性动画之平移动画)

    Android 系统状态栏一体化

    android 透明状态栏是怎样实现的