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

主要代码:

  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. idea编译工程时出现Error:java: 无效的目标发行版: 1.8

    见图,从上述可以看出工程用的jdk1.7,而idea编译时采用的是1.8版本(应该idea新版本内置的jre是1.8吧,默认编译采用1.8) 修改:如下图    http://blog.csdn.ne ...

  2. grok 正则解析日志例子<1>

    <pre name="code" class="html">下面是日志的样子 55.3.244.1 GET /index.html 15824 0. ...

  3. HDU 1796 Howmany integers can you find (容斥原理)

    How many integers can you find Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  4. Uber上海公司被司机打上门

    “Uber上周的工资没有到账,司机们都急了.”9月13日,<IT时报>记者接到Uber司机爆料,称Uber(优步)拖欠工资,客服给的解释是银行系统对接问题,但多名司机赶往Uber上海公司咨 ...

  5. mongodb启动关闭;

    [正确关闭方法] 方法一 ps  -ef |grep mongodb 找到你要查找的进程号 kill -2  pid    杀掉 方法二 也可以进入到mongo数据库里面进行操作./mongouse ...

  6. cmd命令大全/cmd命令提示符大全

    刚接触电脑的时候是从DOS系统开始,DOS时代根本就没有Windows这样的视窗操作界面,只有一个黑漆漆的窗口,让你输入命令.所以学DOS系统操作,cmd命令提示符是不可或缺的.可以告诉大家,大多数的 ...

  7. 小米手机与魅族的PK战结果 说明了什么

    我国电子商务面临的问题,淘宝退出百度无疑是一个遗憾.当在网上购物时.用户面临的一个非常大的问题就是怎样在众多的站点找到自己想要的物品,并以最低的价格买到.自从淘宝退出百度.建立自己的搜索引擎后,广大消 ...

  8. Linux 脚本整理

    本页主要用来记录一点 Shell 脚本. 1. cd - #切换回上一次的路径 这个命令对 cd 频繁的操作很有用 2. sudo !! #授权给上次录入的命令 比如一般非 root 用户在执行 if ...

  9. 在Win7的IIS上搭建FTP服务及用户授权

    FTP服务 FTP是文件传输协议(File Transfer Protocol)的简称,该协议属于应用层协议(端口号通常为21),用于Internet上的双向文件传输(即文件的上传和下载).在网络上有 ...

  10. 屏蔽错误:LNK2038

    最近在使用Qt(VS2010编译)的过程中,需要调用COM库,在Qt中加入了QAxContainer模块,是一个LIB库,在把编译模式从Debug改为Release 后链接报告了一堆错误 -1: 错误 ...