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

主要代码:

  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. tftp使用方法

    参数说明:-l   是local的缩写,后跟存在于Client的源文件名,或下载Client后               重命名的文件名.          -r   是remote的缩写,后跟Se ...

  2. NoSql 精粹导读图

  3. linux之SQL语句简明教程---UNION

    UNION 指令的目的是将两个 SQL 语句的结果合并起来.从这个角度来看, UNION 跟 JOIN有些许类似,因为这两个指令都可以由多个表格中撷取资料. UNION 的一个限制是两个 SQL 语句 ...

  4. poj 2975 Nim_最经典的Nim取石子

    题意:给你n堆石头,每次只能在一堆取最少一个石子,最后拿走最后一堆的为胜者,问胜者有多少种赢得取法 #include <iostream> #include<cstdio> u ...

  5. linux中的strings命令简介

    摘自:http://blog.csdn.net/stpeace/article/details/46641069 linux中的strings命令简介 在linux下搞软件开发的朋友, 几乎没有不知道 ...

  6. 2、Lucene 最简单的使用(小例子)

    在了解了Lucene以后,我打算亲手来做一个Lucene的小例子,这个例子只是Lucene最简单的应用:使用Lucene实现标准的英文搜索: 1.下载Lucene 下载Lucene,到Lucene的官 ...

  7. python安装完毕后,提示找不到ssl模块的解决方示

    python安装完毕后,提示找不到ssl模块: [root@localhost ~]# python2.7.5 Python 2.7.5 (default, Jun 3 2013, 11:08:43) ...

  8. sort(水题)

    sort Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. 手工删除oracle的方法

    大致方法如下:  1.删除物理文件     1.1.oracle安装文件.     1.2.系统目录下,program files文件下的oracle文件 2.注册表中大概有这么几个地方:  hkey ...

  10. ADO.NET DataSet、DataTable、DataRow、DataView的学习

    对于一个datatable中的数据进行嵌套查询判断某几列数据是否相同从而确定这条数据是否一样,并确定他重复的次数COUNT1字段. 例如: DataTable dt = new DataTable() ...