android java仿微信,Android 仿微信滑动删除

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

af7c6e4f9d339a4569b5cf902f7ebecf.png

73e208682e01241b7a3b21c0104a9ba3.png

主要代码:

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

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值