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


主要代码:
- package com.zbq.widget;
- import android.content.Context;
- import android.util.AttributeSet;
- import android.view.GestureDetector;
- import android.view.MotionEvent;
- import android.view.View;
- import android.widget.ListView;
- public class DelSlideListView extends ListView implements
- GestureDetector.OnGestureListener, View.OnTouchListener {
- private GestureDetector mDetector;
- private OnDeleteListioner mOnDeleteListioner;
- private int position;
- private float velocityX, velocityY;
- private ListViewonSingleTapUpListenner thisonSingleTapUpListenner;
- public DelSlideListView(Context context) {
- super(context);
- init(context);
- }
- public DelSlideListView(Context context, AttributeSet att) {
- super(context, att);
- init(context);
- }
- public void setDeleteListioner(OnDeleteListioner mOnDeleteListioner) {
- this.mOnDeleteListioner = mOnDeleteListioner;
- }
- public void setSingleTapUpListenner(
- ListViewonSingleTapUpListenner thisonSingleTapUpListenner) {
- this.thisonSingleTapUpListenner = thisonSingleTapUpListenner;
- }
- private int standard_touch_target_size = 0;
- private float mLastMotionX;
- public boolean deleteView = false;
- private ScrollLinerLayout mScrollLinerLayout;
- private boolean scroll = false;
- private int pointToPosition;
- private boolean listViewMoving;
- private boolean delAll = false;
- public boolean isLongPress = false;
- public boolean isDelAll() {
- return delAll;
- }
- public void setDelAll(boolean delAll) {
- this.delAll = delAll;
- }
- private void init(Context mContext) {
- mDetector = new GestureDetector(mContext, this);
- mDetector.setIsLongpressEnabled(false);
- standard_touch_target_size = (int) getResources().getDimension(
- R.dimen.delete_action_len);
- this.setOnTouchListener(this);
- }
- public boolean onDown(MotionEvent e) {
- if (thisonSingleTapUpListenner != null) {
- thisonSingleTapUpListenner.onSingleTapUp();
- }
- mLastMotionX = e.getX();
- pointToPosition = this.pointToPosition((int) e.getX(), (int) e.getY());
- final int p = pointToPosition - this.getFirstVisiblePosition();
- if (mScrollLinerLayout != null) {
- mScrollLinerLayout.onDown();
- mScrollLinerLayout.setSingleTapUp(true);
- }
- if (deleteView && p != position) {
- deleteView = false;
- if (mScrollLinerLayout != null) {
- mScrollLinerLayout.snapToScreen(0);
- mScrollLinerLayout.setSingleTapUp(false);
- }
- position = p;
- scroll = false;
- return true;
- }
- isLongPress = false;
- position = p;
- scroll = false;
- listViewMoving = false;
- return false;
- }
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
- float velocityY) {
- this.velocityX = velocityX;
- this.velocityY = velocityY;
- return false;
- }
- public void onLongPress(MotionEvent e) {
- }
- public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
- float distanceY) {
- if (listViewMoving && !scroll) {
- if (mScrollLinerLayout != null)
- mScrollLinerLayout.snapToScreen(0);
- return false;
- } else if (scroll) {
- if (mScrollLinerLayout != null) {
- int deltaX = (int) (mLastMotionX - e2.getX());
- if (deleteView) {
- deltaX += standard_touch_target_size;
- }
- if (deltaX >= 0 && deltaX <= standard_touch_target_size) {
- mScrollLinerLayout.scrollBy(
- deltaX - mScrollLinerLayout.getScrollX(), 0);
- }
- }
- } else {
- if (Math.abs(distanceX) > Math.abs(distanceY)) {
- final int pointToPosition1 = this.pointToPosition(
- (int) e2.getX(), (int) e2.getY());
- final int p1 = pointToPosition1
- - this.getFirstVisiblePosition();
- if (p1 == position && mOnDeleteListioner.isCandelete(p1)) {
- mScrollLinerLayout = (ScrollLinerLayout) this
- .getChildAt(p1);
- if (mScrollLinerLayout != null) {
- int deltaX = (int) (mLastMotionX - e2.getX());
- if (deleteView) {
- deltaX += standard_touch_target_size;
- }
- if (deltaX >= 0 && deltaX <= standard_touch_target_size
- && Math.abs(distanceY) < 5) {
- isLongPress = true;
- scroll = true;
- listViewMoving = false;
- mScrollLinerLayout.setSingleTapUp(false);
- mScrollLinerLayout.scrollBy(
- (int) (e1.getX() - e2.getX()), 0);
- }
- }
- }
- }
- }
- if (scroll) {
- return true;
- }
- return false;
- }
- public void onShowPress(MotionEvent e) {
- }
- public boolean onSingleTapUp(MotionEvent e) {
- if (deleteView) {
- position = -1;
- deleteView = false;
- mScrollLinerLayout.snapToScreen(0);
- scroll = false;
- return true;
- }
- return false;
- }
- public void setScroll(boolean b) {
- listViewMoving = b;
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- if (scroll || deleteView) {
- return true;
- }
- return super.onTouchEvent(event);
- }
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- if (isDelAll()) {
- return false;
- } else {
- if (event.getAction() == MotionEvent.ACTION_UP
- || event.getAction() == MotionEvent.ACTION_CANCEL) {
- int deltaX2 = (int) (mLastMotionX - event.getX());
- if (scroll) {
- if (!deleteView
- && deltaX2 >= standard_touch_target_size / 2) {
- mScrollLinerLayout
- .snapToScreen(standard_touch_target_size);
- position = pointToPosition
- - this.getFirstVisiblePosition();
- deleteView = true;
- } else {
- position = -1;
- deleteView = false;
- mScrollLinerLayout.snapToScreen(0);
- }
- scroll = false;
- return true;
- }/* else if (Math.abs(velocityX) > Math.abs(velocityY)
- && deltaX2 < -80) {
- mOnDeleteListioner.onBack();
- return false;
- }*/
- }
- return mDetector.onTouchEvent(event);
- }
- }
- public void deleteItem() {
- position = -1;
- deleteView = false;
- scroll = false;
- if (mScrollLinerLayout != null) {
- mScrollLinerLayout.snapToScreen(0);
- }
- }
- }
- DeleteSlide.zip (1.5 MB)
- 下载次数: 451
Android 仿微信滑动删除的更多相关文章
- Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等
仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 微信 微信 微信 ...
- Android 仿微信小视频录制
Android 仿微信小视频录制 WechatShortVideo和WechatShortVideo文章
- [转]ANDROID仿IOS微信滑动删除_SWIPELISTVIEW左滑删除例子
转载:http://dwtedx.sinaapp.com/itshare_290.html 本例子实现了滑动删除ListView的Itemdemo的效果.大家都知道.这种创意是来源于IOS的.左滑删除 ...
- android仿微信红包动画、Kotlin综合应用、Xposed模块、炫酷下拉视觉、UC浏览器滑动动画等源码
Android精选源码 仿微信打开红包旋转动画 使用Kotlin编写的Android应用,内容你想象不到 Android手机上的免Root Android系统日志Viewer 一个能让微信 Mater ...
- Android 仿微信朋友圈发表图片拖拽和删除功能
朋友圈实现原理 我们使用 Android Device Monitor 来分析朋友圈发布图片的界面实现原理.如果需要分析其他应用的界面实现也是采用这种方法哦. 打开 Android Device Mo ...
- android中列表的滑动删除仿ios滑动删除
大家是不是觉得ios列表的滑动删除效果很酷炫?不用羡慕android也可以实现相同的效果 并且可以自定义效果,比如左滑删除,置顶,收藏,分享等等 其实就是自定义listview重写listview方法 ...
- Android仿微信拍摄短视频
近期做项目需要添加上传短视频功能,功能设置为类似于微信,点击开始拍摄,设置最长拍摄时间,经过研究最终实现了这个功能,下面就和大家分享一下,希望对你有帮助. 1.视频录制自定义控件: /** * 视频播 ...
- Android 仿微信朋友圈发动态功能(相册图片多选)
代码分享 代码名称: 仿微信朋友圈发动态功能(相册图片多选) 代码描述: 仿微信朋友圈发动态功能(相册图片多选) 代码托管地址: http://www.apkbus.com/android-15276 ...
- Android 仿微信朋友圈添加图片
github地址(欢迎下载Demo) https://github.com/zhouxu88/WXCircleAddPic 老习惯,先上图,着急用的朋友,直接带走Demo,先拿来用吧,毕竟老板催的紧, ...
随机推荐
- 跨越多台haproxy 跳转
<pre name="code" class="python">在zjtest5环境的haproxy上配置: 需要 访问acl host_zjcap ...
- poj1458 dp入门
Common Subsequence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 37551 Accepted: 15 ...
- OpenSuSE zypper repo及Desktop媒体播放器设置 for OpenSuSE12.
1.禁用官方源和DVD光盘源,启用中国大陆源 使用DVD光盘安装好openSUSE 12.2之后,软件安装源中默认存在一个名称为”openSUSE-12.2-1.6″的软件源,这个源的URL实际上是指 ...
- OC基础11:基本的C语言特性2
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 19.定义一个int类型的指针: int ...
- linux中grep使用方法具体解释
查找特定字符串并颜色显示 [root@fwq test]# grep -n 'the' regular_express.txt --color=auto 8:I can't finish the te ...
- ios5和ios6横竖屏支持及ipad和iphone设备的判断
ios5和ios6横竖屏支持及ipad和iphone设备的判断 判断是ipad还是iphone设备.此定义在PayViewControllerDemo-Prefix.pch 定义如下: #define ...
- 有用的jQuery布局插件推荐
网页设计中排版也是很重要的,但有些比较难的网页排版我们可以用一些jQuery来实现,今天文章中主要分享一些有用的jQuery布局插件,有类似Pinterest流布局插件.友荐的滑动提示块以及其它jQu ...
- 工厂类分离与java反射机制
网易 博客 发现 小组 风格 手机博客 玩LOFTER,免费冲印20张照片!> 创建博客登录 加关注 黙言-在路上 奋斗 首页 日志 相册 音乐 收藏 博友 关于我 黙 ...
- MVC 传参
介绍一些View中常用的东西 1:传递参数: 1):路由协议中传递参数: 1):eg:比如是这样类似的路由协议,那么我们在传递参数的时候,就要传递 id过去,当然如果,ABCD= UrlParamet ...
- 关于ECharts Java类库的一个jquery插件
在项目中开发图表功能时用到了Echars和一个关于Echars的java类库(http://git.oschina.net/free/ECharts).这个类库主要目的是方便在Java中构造EChar ...