做这个功能主要是项目需要:找了很多资料但是效果都不理想,后来就自己研究写了一个,拿出来共享给大家,贴上代码大家慢慢看看,还是比较容易懂的。

主要代码:

  1. package com.zbq.widget;
  2. import android.content.Context;
  3. import android.util.AttributeSet;
  4. import android.view.GestureDetector;
  5. import android.view.MotionEvent;
  6. import android.view.View;
  7. import android.widget.ListView;
  8. public class DelSlideListView extends ListView implements
  9. GestureDetector.OnGestureListener, View.OnTouchListener {
  10. private GestureDetector mDetector;
  11. private OnDeleteListioner mOnDeleteListioner;
  12. private int position;
  13. private float velocityX, velocityY;
  14. private ListViewonSingleTapUpListenner thisonSingleTapUpListenner;
  15. public DelSlideListView(Context context) {
  16. super(context);
  17. init(context);
  18. }
  19. public DelSlideListView(Context context, AttributeSet att) {
  20. super(context, att);
  21. init(context);
  22. }
  23. public void setDeleteListioner(OnDeleteListioner mOnDeleteListioner) {
  24. this.mOnDeleteListioner = mOnDeleteListioner;
  25. }
  26. public void setSingleTapUpListenner(
  27. ListViewonSingleTapUpListenner thisonSingleTapUpListenner) {
  28. this.thisonSingleTapUpListenner = thisonSingleTapUpListenner;
  29. }
  30. private int standard_touch_target_size = 0;
  31. private float mLastMotionX;
  32. public boolean deleteView = false;
  33. private ScrollLinerLayout mScrollLinerLayout;
  34. private boolean scroll = false;
  35. private int pointToPosition;
  36. private boolean listViewMoving;
  37. private boolean delAll = false;
  38. public boolean isLongPress = false;
  39. public boolean isDelAll() {
  40. return delAll;
  41. }
  42. public void setDelAll(boolean delAll) {
  43. this.delAll = delAll;
  44. }
  45. private void init(Context mContext) {
  46. mDetector = new GestureDetector(mContext, this);
  47. mDetector.setIsLongpressEnabled(false);
  48. standard_touch_target_size = (int) getResources().getDimension(
  49. R.dimen.delete_action_len);
  50. this.setOnTouchListener(this);
  51. }
  52. public boolean onDown(MotionEvent e) {
  53. if (thisonSingleTapUpListenner != null) {
  54. thisonSingleTapUpListenner.onSingleTapUp();
  55. }
  56. mLastMotionX = e.getX();
  57. pointToPosition = this.pointToPosition((int) e.getX(), (int) e.getY());
  58. final int p = pointToPosition - this.getFirstVisiblePosition();
  59. if (mScrollLinerLayout != null) {
  60. mScrollLinerLayout.onDown();
  61. mScrollLinerLayout.setSingleTapUp(true);
  62. }
  63. if (deleteView && p != position) {
  64. deleteView = false;
  65. if (mScrollLinerLayout != null) {
  66. mScrollLinerLayout.snapToScreen(0);
  67. mScrollLinerLayout.setSingleTapUp(false);
  68. }
  69. position = p;
  70. scroll = false;
  71. return true;
  72. }
  73. isLongPress = false;
  74. position = p;
  75. scroll = false;
  76. listViewMoving = false;
  77. return false;
  78. }
  79. public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
  80. float velocityY) {
  81. this.velocityX = velocityX;
  82. this.velocityY = velocityY;
  83. return false;
  84. }
  85. public void onLongPress(MotionEvent e) {
  86. }
  87. public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
  88. float distanceY) {
  89. if (listViewMoving && !scroll) {
  90. if (mScrollLinerLayout != null)
  91. mScrollLinerLayout.snapToScreen(0);
  92. return false;
  93. } else if (scroll) {
  94. if (mScrollLinerLayout != null) {
  95. int deltaX = (int) (mLastMotionX - e2.getX());
  96. if (deleteView) {
  97. deltaX += standard_touch_target_size;
  98. }
  99. if (deltaX >= 0 && deltaX <= standard_touch_target_size) {
  100. mScrollLinerLayout.scrollBy(
  101. deltaX - mScrollLinerLayout.getScrollX(), 0);
  102. }
  103. }
  104. } else {
  105. if (Math.abs(distanceX) > Math.abs(distanceY)) {
  106. final int pointToPosition1 = this.pointToPosition(
  107. (int) e2.getX(), (int) e2.getY());
  108. final int p1 = pointToPosition1
  109. - this.getFirstVisiblePosition();
  110. if (p1 == position && mOnDeleteListioner.isCandelete(p1)) {
  111. mScrollLinerLayout = (ScrollLinerLayout) this
  112. .getChildAt(p1);
  113. if (mScrollLinerLayout != null) {
  114. int deltaX = (int) (mLastMotionX - e2.getX());
  115. if (deleteView) {
  116. deltaX += standard_touch_target_size;
  117. }
  118. if (deltaX >= 0 && deltaX <= standard_touch_target_size
  119. && Math.abs(distanceY) < 5) {
  120. isLongPress = true;
  121. scroll = true;
  122. listViewMoving = false;
  123. mScrollLinerLayout.setSingleTapUp(false);
  124. mScrollLinerLayout.scrollBy(
  125. (int) (e1.getX() - e2.getX()), 0);
  126. }
  127. }
  128. }
  129. }
  130. }
  131. if (scroll) {
  132. return true;
  133. }
  134. return false;
  135. }
  136. public void onShowPress(MotionEvent e) {
  137. }
  138. public boolean onSingleTapUp(MotionEvent e) {
  139. if (deleteView) {
  140. position = -1;
  141. deleteView = false;
  142. mScrollLinerLayout.snapToScreen(0);
  143. scroll = false;
  144. return true;
  145. }
  146. return false;
  147. }
  148. public void setScroll(boolean b) {
  149. listViewMoving = b;
  150. }
  151. @Override
  152. public boolean onTouchEvent(MotionEvent event) {
  153. if (scroll || deleteView) {
  154. return true;
  155. }
  156. return super.onTouchEvent(event);
  157. }
  158. @Override
  159. public boolean onTouch(View v, MotionEvent event) {
  160. if (isDelAll()) {
  161. return false;
  162. } else {
  163. if (event.getAction() == MotionEvent.ACTION_UP
  164. || event.getAction() == MotionEvent.ACTION_CANCEL) {
  165. int deltaX2 = (int) (mLastMotionX - event.getX());
  166. if (scroll) {
  167. if (!deleteView
  168. && deltaX2 >= standard_touch_target_size / 2) {
  169. mScrollLinerLayout
  170. .snapToScreen(standard_touch_target_size);
  171. position = pointToPosition
  172. - this.getFirstVisiblePosition();
  173. deleteView = true;
  174. } else {
  175. position = -1;
  176. deleteView = false;
  177. mScrollLinerLayout.snapToScreen(0);
  178. }
  179. scroll = false;
  180. return true;
  181. }/* else if (Math.abs(velocityX) > Math.abs(velocityY)
  182. && deltaX2 < -80) {
  183. mOnDeleteListioner.onBack();
  184. return false;
  185. }*/
  186. }
  187. return mDetector.onTouchEvent(event);
  188. }
  189. }
  190. public void deleteItem() {
  191. position = -1;
  192. deleteView = false;
  193. scroll = false;
  194. if (mScrollLinerLayout != null) {
  195. mScrollLinerLayout.snapToScreen(0);
  196. }
  197. }
  198. }

Android 仿微信滑动删除的更多相关文章

  1. Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等

    仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 微信 微信 微信 ...

  2. Android 仿微信小视频录制

    Android 仿微信小视频录制 WechatShortVideo和WechatShortVideo文章

  3. [转]ANDROID仿IOS微信滑动删除_SWIPELISTVIEW左滑删除例子

    转载:http://dwtedx.sinaapp.com/itshare_290.html 本例子实现了滑动删除ListView的Itemdemo的效果.大家都知道.这种创意是来源于IOS的.左滑删除 ...

  4. android仿微信红包动画、Kotlin综合应用、Xposed模块、炫酷下拉视觉、UC浏览器滑动动画等源码

    Android精选源码 仿微信打开红包旋转动画 使用Kotlin编写的Android应用,内容你想象不到 Android手机上的免Root Android系统日志Viewer 一个能让微信 Mater ...

  5. Android 仿微信朋友圈发表图片拖拽和删除功能

    朋友圈实现原理 我们使用 Android Device Monitor 来分析朋友圈发布图片的界面实现原理.如果需要分析其他应用的界面实现也是采用这种方法哦. 打开 Android Device Mo ...

  6. android中列表的滑动删除仿ios滑动删除

    大家是不是觉得ios列表的滑动删除效果很酷炫?不用羡慕android也可以实现相同的效果 并且可以自定义效果,比如左滑删除,置顶,收藏,分享等等 其实就是自定义listview重写listview方法 ...

  7. Android仿微信拍摄短视频

    近期做项目需要添加上传短视频功能,功能设置为类似于微信,点击开始拍摄,设置最长拍摄时间,经过研究最终实现了这个功能,下面就和大家分享一下,希望对你有帮助. 1.视频录制自定义控件: /** * 视频播 ...

  8. Android 仿微信朋友圈发动态功能(相册图片多选)

    代码分享 代码名称: 仿微信朋友圈发动态功能(相册图片多选) 代码描述: 仿微信朋友圈发动态功能(相册图片多选) 代码托管地址: http://www.apkbus.com/android-15276 ...

  9. Android 仿微信朋友圈添加图片

    github地址(欢迎下载Demo) https://github.com/zhouxu88/WXCircleAddPic 老习惯,先上图,着急用的朋友,直接带走Demo,先拿来用吧,毕竟老板催的紧, ...

随机推荐

  1. 跨越多台haproxy 跳转

    <pre name="code" class="python">在zjtest5环境的haproxy上配置: 需要 访问acl host_zjcap ...

  2. poj1458 dp入门

    Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 37551   Accepted: 15 ...

  3. OpenSuSE zypper repo及Desktop媒体播放器设置 for OpenSuSE12.

    1.禁用官方源和DVD光盘源,启用中国大陆源 使用DVD光盘安装好openSUSE 12.2之后,软件安装源中默认存在一个名称为”openSUSE-12.2-1.6″的软件源,这个源的URL实际上是指 ...

  4. OC基础11:基本的C语言特性2

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 19.定义一个int类型的指针: int ...

  5. linux中grep使用方法具体解释

    查找特定字符串并颜色显示 [root@fwq test]# grep -n 'the' regular_express.txt --color=auto 8:I can't finish the te ...

  6. ios5和ios6横竖屏支持及ipad和iphone设备的判断

    ios5和ios6横竖屏支持及ipad和iphone设备的判断 判断是ipad还是iphone设备.此定义在PayViewControllerDemo-Prefix.pch 定义如下: #define ...

  7. 有用的jQuery布局插件推荐

    网页设计中排版也是很重要的,但有些比较难的网页排版我们可以用一些jQuery来实现,今天文章中主要分享一些有用的jQuery布局插件,有类似Pinterest流布局插件.友荐的滑动提示块以及其它jQu ...

  8. 工厂类分离与java反射机制

    网易 博客 发现 小组 风格 手机博客 玩LOFTER,免费冲印20张照片!> 创建博客登录  加关注 黙言-在路上 奋斗 首页 日志 相册 音乐 收藏 博友 关于我             黙 ...

  9. MVC 传参

    介绍一些View中常用的东西 1:传递参数: 1):路由协议中传递参数: 1):eg:比如是这样类似的路由协议,那么我们在传递参数的时候,就要传递 id过去,当然如果,ABCD= UrlParamet ...

  10. 关于ECharts Java类库的一个jquery插件

    在项目中开发图表功能时用到了Echars和一个关于Echars的java类库(http://git.oschina.net/free/ECharts).这个类库主要目的是方便在Java中构造EChar ...