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

主要代码:

  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. 跨域(cross-domain)访问 cookie (读取和设置)

    Passport 一方面意味着用一个帐号可以在不同服务里登录,另一方面就是在一个服务里面登录后可以无障碍的漫游到其他服务里面去.坦白说,目前 sohu passport 在这一点实现的很烂(不过俺的工 ...

  2. Google map v3 using simple tool file google.map.util.js v 1.2

    更新添加日志:在1.1的基础上添加marker的文字显示.测距工具. /** * GOOGLE地图开发使用工具 * @author BOONYACHENGDU@GMAIL.COM * @date 20 ...

  3. uva10820 send a table (nlogn求1-n欧拉函数值模版

    //重点就是求1-n的欧拉函数啦,重点是nlogn求法的版 //大概过程类似于筛选法求素数 #include<cstdio> #include<iostream> #inclu ...

  4. 【POJ 3669 Meteor Shower】简单BFS

    流星雨撞击地球(平面直角坐标第一象限),问到达安全地带的最少时间. 对于每颗流星雨i,在ti时刻撞击(xi,yi)点,同时导致(xi,yi)和上下左右相邻的点在ti以后的时刻(包括t)不能再经过(被封 ...

  5. nm命令中符号类型详解

    摘自http://blog.csdn.net/solmyr_biti/article/details/6565479 nm命令介绍的很多,但大多不介绍其函数符号标志的含义.最近在调试动态库时常用到,其 ...

  6. 解决Mac OS Adobe Flash Builder 4.7 java heap space 问题【转】

    1. 在Finder中打开Adobe Flash Builder 4.7的安装目录 2. 在Adobe Flash Builder 4.7.app上点击右键“Show Package contents ...

  7. Erp第三章:管理问题与MRP、MRP2、ERP

    1企业管理者经常头疼问题:一.“产供销”严重脱节 .       二.财务数据和业务数据对不上号 2.MRP(物料需求计划,Material Requiremengts Planning),MRP2( ...

  8. Android学习之简单的数据存储

    在Android中,数据存储是开发人员不可以避免的.Android为开发者提供了很多的存储方法,在前面的博客中,已经讲述了sqlite存储数据.今天将介绍用SharedPreferences来存储数据 ...

  9. matlab中norm与svd函数用法

    格式:n=norm(A,p) 功能:norm函数可计算几种不同类型的矩阵范数,根据p的不同可得到不同的范数 以下是Matlab中help norm 的解释: NORM Matrix or vector ...

  10. Android Studio 打包流程

    (1)Android Studio菜单Build->Generate Signed APK (2)弹出窗口 (3)创建密钥库及密钥,创建后会自动选择刚创建的密钥库和密钥(已拥有密钥库跳过)    ...