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