`
104zz
  • 浏览: 1507807 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

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);
		}
	}
}

 
 

  • 大小: 41.4 KB
  • 大小: 38.9 KB
分享到:
评论
7 楼 jjxp 2015-04-12  
                              
6 楼 a644875733 2015-04-07  
效果有。不过。亲。你的注释呢。整个dome一个注释都没有。。
5 楼 lijinchao2007 2015-03-25  
4 楼 lijinchao2007 2015-03-25  
我做了一点改动:http://lijinchao.sinaapp.com/archives/100
3 楼 zd1471278687 2014-11-06  
效果真的是太漂亮了,得好好学习一下 
2 楼 亚亚亚亚 2014-04-16  
  
1 楼 u011539532 2014-03-28  
demo可用,但数据加载若放在onResume的话,在页面多次访问时候数据会叠加,

相关推荐

    Android 仿微信滑动删除效果demo源码

    这个“Android 仿微信滑动删除效果demo源码”就是一个很好的学习资源,它可以帮助开发者实现类似微信的消息滑动删除功能。 首先,我们要了解滑动删除效果的核心机制。这一效果通常是通过在ListView、RecyclerView...

    Android 仿微信对话列表滑动删除效果

    本教程将详细介绍如何在Android项目中实现“仿微信对话列表滑动删除效果”。 首先,我们需要理解滑动删除的核心原理。这种效果通常是通过在ListView或者RecyclerView等滚动视图上添加手势检测来实现的。当用户滑动...

    Android仿微信滑动删除等操作

    综上所述,实现"Android 仿微信 ListView 滑动删除"的操作涉及多个技术点,包括手势检测、自定义Adapter、动画效果、事件处理以及可能的异步操作。通过这些技术的结合,我们可以创建一个功能丰富的、与微信类似的...

    Android仿ios微信滑动删除、置顶的实现

    Android仿ios微信滑动删除、置顶的实现: 左划ListView的item,当前条目出现“删除”和“置顶”两个按钮,点击其他位置,按钮隐藏,点击“删除”,当前条目消失。点击“置顶”,当前条目显示在第一行

    android listview仿微信滑动删除

    本篇文章将详细解析如何在Android中实现“android listview仿微信滑动删除”的功能。 首先,滑动删除(Swipe to Delete)是提高用户体验的一种方式,它允许用户通过简单的手势快速删除列表中的条目。在微信中,当...

    android 仿微信列表滑动出现删除,置顶效果

    在本教程中,我们将深入探讨如何在Android应用中复现“微信列表滑动出现删除、置顶效果”。 首先,我们需要了解该效果的核心技术点: 1. **SwipeRefreshLayout**:Android SDK提供了一个叫做SwipeRefreshLayout的...

    Android仿微信列表滑动删除 如何实现滑动列表SwipeListView

    总的来说,实现Android仿微信列表滑动删除的关键在于自定义`SwipeItemView`和`SwipeListView`,重写触摸事件处理,以及在滑动过程中进行精确的视图控制和动画效果。开发者可以根据实际需求调整代码细节,以适应不同...

    高仿微信左滑删除效果

    在实际开发中,我们需要深入理解平台特性和UI组件,才能创建出既美观又实用的滑动删除体验。无论是Android还是iOS,都需要对系统的事件处理机制和动画框架有扎实的掌握,这样才能打造出与微信类似的流畅体验。

    Android ListView 仿微信侧滑删除

    "Android ListView 仿微信侧滑删除"这个主题涉及到如何实现类似微信中常见的侧滑菜单功能,即用户在ListView的每一项上向左滑动时,会显示出一个包含删除按钮的视图,允许用户快速删除列表中的某一项。下面我们将...

    Android仿qq,微信 滑动删除功能

    以上就是实现Android仿QQ、微信滑动删除功能的基本步骤和技术要点。在实际开发中,可以根据项目需求进行调整和定制,比如添加更多动画效果,或者结合其他交互元素,使功能更加丰富和人性化。在SlideViewDemo中,你...

    Android 仿微信QQ listView滑动出现删除修改按钮,点击删除按钮弹底部对话框进行确定删除

    在Android开发中,微信和QQ等社交应用的交互设计经常被其他开发者借鉴,其中就包括在ListView中实现滑动显示删除或修改按钮的功能。这个功能不仅提升了用户体验,也让操作更加直观便捷。本教程将详细讲解如何实现这...

    Android开发--仿微信语音对讲录音,按住讲话进行录音,向上滑动可以进行取消录音.zip

    在Android应用开发中,微信的语音对讲功能是一种常见的交互方式,它允许用户通过按住按钮来录制语音,松开时发送,或者在录制过程中上滑取消。这个功能的实现涉及多个技术点,包括音频录制、手势识别以及UI交互设计...

    仿微信对话列表滑动删除功能

    在Android开发中,微信对话列表滑动删除功能是一项常见的用户交互设计,它为用户提供了一种高效、直观的方式来管理他们的聊天记录。实现这个功能主要涉及到ListView或者RecyclerView组件的自定义适配器以及手势检测...

    Android仿微信好友列表滑动删除功能.rar

    Android界面UI侧滑方面的源码实例,这个是仿微信好友列表的滑动删除功能,在此基础上增加了可定义 SlideListViewDelete的功能。运行后,在模拟器上拖动任意一个列表项向左滑,右侧会出现“删除”功能,是不是觉得很...

    Android开发,仿微信选择图片的图片选择器

    总的来说,实现一个"Android开发,仿微信选择图片的图片选择器"需要综合运用Android SDK的多种功能,结合现代开发最佳实践,如模块化、依赖注入、异步处理等,确保功能的稳定性和用户体验。同时,测试代码(如...

    Android高仿微信对话列表滑动删除效果

    在Android开发中,实现类似微信对话列表的滑动删除效果是一项常见的需求,它能提供用户友好的交互体验。本文将详细介绍如何在Android中高仿微信对话列表的滑动删除功能。 首先,我们要创建一个可滑动的ListView。在...

    android仿支付宝微信输入密码框

    同时,可以使用`OnTouchListener`来监听整个输入框的触摸事件,以便处理滑动删除、确认等操作。 3. **数字键盘**:可以使用系统自带的软键盘,也可以自定义一个数字键盘。自定义键盘可以通过弹出`Dialog`或者`...

    Android仿微信对话列表滑动删除效果

    总的来说,实现“Android仿微信对话列表滑动删除效果”涉及到自定义ListView、监听触摸事件、计算滑动距离、以及执行动画等多方面的技术。通过这种方式,开发者可以为自己的应用添加类似微信的交互体验,提高用户的...

    仿微信聊天置顶

    在仿微信聊天置顶的场景中,我们可以使用`LinkedList`来存储用户的聊天记录,因为它的插入和删除操作相对高效,特别是对于头部元素的操作,这正好符合置顶聊天的需求。 接着,我们探讨如何实现UI部分。在Android中...

Global site tag (gtag.js) - Google Analytics