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

主要代码:

  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. C语言的本质(14)——不完全类型和复杂声明

    ISO 将 C 的类型分为三个不同的集合: 函数.对象和不完全类型三大类.函数类型很明显:对象类型包含其他一切,除非不知道对象的大小.该标准使用术语"对象类型"指定指派的对象必须具 ...

  2. linux之SQL语句简明教程---BETWEEN

    IN 这个指令可以让我们依照一或数个不连续 (discrete) 的值的限制之内抓出数据库中的值,而BETWEEN 则是让我们可以运用一个范围 (range) 内抓出数据库中的值.BETWEEN 这个 ...

  3. linux监控脚本

    1,snmp安装脚本for ubuntu/CentOS #!/usr/bin/env bash export LC_ALL=C " ] then >& exit fi #### ...

  4. Linq 中的Select事例

    ---恢复内容开始--- 1.对查询结果进行转换. string[] names={"ADE","Jerry","Steves"}; var ...

  5. C#6 冒泡 折半查找 二维数组

    人类思维--计算机逻辑思维 逻辑思维--代码实现 写书法: 描红--临摹--碑贴--自成一体--草 章节复习: 数组:一维,二维,多维 一维:豆角.连续,同一类型. 定义:数据类型[] 数组名=new ...

  6. switch 与 whille相互套用

    一直自以为还比较了解C++,这两天写个小工具结果出现了个bug,查了几个小时.现在才发现我这么水. switch是C++后来推出了,目的在于提高代码结构清晰度. 但是switch与while连用时是有 ...

  7. MySQL取得当前时间的函数是什么 格式化日期的函数是什么

    取得当前时间用 now() 就行.在数据库中格式化时间 用DATE_FORMA T(date, format) .根据格式串format 格式化日期或日期和时间值date,返回结果串. 可用DATE_ ...

  8. oracle distinct 去除重复,同时按某字段排序

    SELECT distinct supplier_id, min(evidence_date) as evidence_date FROM TD_SUPPLIER_EVIDENCE_INFO wher ...

  9. jquery ajax后台向前台传list 前台用jquery $.each遍历list

    $.ajax({ type: 'post', url: xxx.action', dataType: 'text', success: function(data){ var dataObj=eval ...

  10. redis安装方法

    redis安装方法1.通过lnmp一键安装包,然后执行./addons.sh install redis2.yum -y install redis3.wget http://redis.google ...