`
104zz
  • 浏览: 1503873 次
  • 性别: 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的话,在页面多次访问时候数据会叠加,

相关推荐

Global site tag (gtag.js) - Google Analytics