您当前的位置: 首页 > 

xiangzhihong8

暂无认证

  • 3浏览

    0关注

    1324博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

listview滑动删除

xiangzhihong8 发布时间:2014-04-04 15:10:50 ,浏览量:3

今天还是给大家带来自定义控件的编写,自定义一个ListView的左右滑动删除Item的效果,这个效果之前已经实现过了,有兴趣的可以看下Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果,之前使用的是滑动类Scroller来实现的,但是看了下通知栏的左右滑动删除效果,确实很棒,当我们滑动Item超过一半的时候,item的透明度就变成了0,我们就知道抬起手指的时候item就被删除了,当item的透明度不为0的时候,我们抬起手指Item会回到起始位置,这样我们就知道拖动到什么位置item会删除,什么位置Item不删除,用户体验更好了,还有一个效果,就是我们滑动删除了item的时候,ListView的其他item会出现向上或者向下滚动的效果,感觉效果很棒,所以在GitHub上面搜索了下,发现很多开源库都有这个效果,比如ListViewAnimations, android-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 在CODE上查看代码片 派生到我的代码片
  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.         ViewConfiguration vc = ViewConfiguration.get(context);  
  101.         mSlop = vc.getScaledTouchSlop();  
  102.         mMinFlingVelocity = vc.getScaledMinimumFlingVelocity() * 8; //获取滑动的最小速度  
  103.         mMaxFlingVelocity = vc.getScaledMaximumFlingVelocity();  //获取滑动的最大速度  
  104.     }  
  105.   
  106.       
  107.     @Override  
  108.     public boolean onTouchEvent(MotionEvent ev) {  
  109.         switch (ev.getAction()) {  
  110.         case MotionEvent.ACTION_DOWN:  
  111.             handleActionDown(ev);  
  112.             break;  
  113.         case MotionEvent.ACTION_MOVE:  
  114.             return handleActionMove(ev);  
  115.         case MotionEvent.ACTION_UP:  
  116.             handleActionUp(ev);  
  117.             break;  
  118.         }  
  119.         return super.onTouchEvent(ev);  
  120.     }  
  121.   
  122.     /** 
  123.      * 按下事件处理 
  124.      *  
  125.      * @param ev 
  126.      * @return 
  127.      */  
  128.     private void handleActionDown(MotionEvent ev) {  
  129.         mDownX = ev.getX();  
  130.         mDownY = ev.getY();  
  131.           
  132.         mDownPosition = pointToPosition((int) mDownX, (int) mDownY);  
  133.   
  134.         if (mDownPosition == AdapterView.INVALID_POSITION) {  
  135.             return;  
  136.         }  
  137.   
  138.         mDownView = getChildAt(mDownPosition - getFirstVisiblePosition());  
  139.   
  140.         if (mDownView != null) {  
  141.             mViewWidth = mDownView.getWidth();  
  142.         }  
  143.   
  144.         //加入速度检测  
  145.         mVelocityTracker = VelocityTracker.obtain();  
  146.         mVelocityTracker.addMovement(ev);  
  147.     }  
  148.       
  149.   
  150.     /** 
  151.      * 处理手指滑动的方法 
  152.      *  
  153.      * @param ev 
  154.      * @return 
  155.      */  
  156.     private boolean handleActionMove(MotionEvent ev) {  
  157.         if (mVelocityTracker == null || mDownView == null) {  
  158.             return super.onTouchEvent(ev);  
  159.         }  
  160.   
  161.         // 获取X方向滑动的距离  
  162.         float deltaX = ev.getX() - mDownX;  
  163.         float deltaY = ev.getY() - mDownY;  
  164.   
  165.         // X方向滑动的距离大于mSlop并且Y方向滑动的距离小于mSlop,表示可以滑动  
  166.         if (Math.abs(deltaX) > mSlop && Math.abs(deltaY) 
关注
打赏
1482932726
查看更多评论
立即登录/注册

微信扫码登录

0.0413s