自定义listview 实现仿qq聊天列表左滑删除效果

来源:互联网 发布:中日网络战 编辑:程序博客网 时间:2024/05/17 23:37

效果:


实际上就是左滑的时候弹出一个具有 动画效果的 popupwindow 动画效果很简单就不贴代码了  示例源码在下面链接

http://download.csdn.net/detail/guesspalm/7200919

package com.young.viewtest;import com.yang.viewtest.R;import android.content.Context;import android.graphics.Color;import android.graphics.drawable.ColorDrawable;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.VelocityTracker;import android.view.View;import android.view.ViewConfiguration;import android.widget.AdapterView;import android.widget.ListView;import android.widget.PopupWindow;public class MyDeleteListView extends ListView {private LayoutInflater inflater;public MyDeleteListView(Context context) {super(context);inflater = LayoutInflater.from(context);ViewConfiguration vc = ViewConfiguration.get(context);mSlop = vc.getScaledTouchSlop();}public MyDeleteListView(Context context, AttributeSet attrs) {super(context, attrs);}public MyDeleteListView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}@Overridepublic boolean onTouchEvent(MotionEvent ev) {switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:handleActionDown(ev);break;case MotionEvent.ACTION_MOVE:return handleActionMove(ev);case MotionEvent.ACTION_UP:handleActionUp(ev);break;}return super.onTouchEvent(ev);}private float mDownX;private float mDownY;/** * 认为是用户滑动的最小距离 */private int mSlop;private int mDownPosition;private OnDeleteCallback onDeleteCallback;/** * 用来标记用户是否正在滑动中 */private boolean mSwiping;/** * 按下的item对应的View */private View mDownView;/** * 滑动速度检测类 */private VelocityTracker mVelocityTracker;/** * item的宽度 */private int mViewWidth;/** * item的高度 */private int mViewHeight;/** * 按下事件处理 *  * @param ev * @return */private void handleActionDown(MotionEvent ev) {mDownX = ev.getX();mDownY = ev.getY();mDownPosition = pointToPosition((int) mDownX, (int) mDownY);if (mDownPosition == AdapterView.INVALID_POSITION) {return;}mDownView = getChildAt(mDownPosition - getFirstVisiblePosition());if (mDownView != null) {mViewWidth = mDownView.getWidth();mViewHeight = mDownView.getHeight();}// 加入速度检测mVelocityTracker = VelocityTracker.obtain();mVelocityTracker.addMovement(ev);}private PopupWindow popupWindow;/** * 手指抬起的事件处理 *  * @param ev */private void handleActionUp(MotionEvent ev) {if (mVelocityTracker == null || mDownView == null || !mSwiping) {return;}if (ev.getX() < mDownX&& Math.abs(ev.getX() - mDownX) > Math.abs(ev.getY() - mDownY)) {// x轴左方向滑动showDeletePopup();}mSwiping = false;}private void showDeletePopup() {View deleteView = inflater.inflate(R.layout.layout_popupwindow, null);deleteView.findViewById(R.id.popupwindow_btn).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {popupWindow.dismiss();if (onDeleteCallback != null) {onDeleteCallback.onDelete(MyDeleteListView.this,mDownPosition);}}});//measure deleteView  后才能获取宽高int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);deleteView.measure(w, h);int height = deleteView.getMeasuredHeight();int width = deleteView.getMeasuredWidth();popupWindow = new PopupWindow(deleteView, LayoutParams.WRAP_CONTENT,android.view.WindowManager.LayoutParams.WRAP_CONTENT, true);popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));// 要设置背景popupWindow.setAnimationStyle(R.style.AnimationPreview);// 动画popupWindow.showAsDropDown(mDownView, mViewWidth - width,-(mViewHeight - (mViewHeight - height) / 2));popupWindow.setFocusable(true);popupWindow.setOutsideTouchable(true);popupWindow.setTouchable(true);}/** * 处理手指滑动的方法 *  * @param ev * @return */private boolean handleActionMove(MotionEvent ev) {if (mVelocityTracker == null || mDownView == null) {return super.onTouchEvent(ev);}float deltaX = ev.getX() - mDownX;float deltaY = ev.getY() - mDownY;// X方向滑动的距离大于mSlop并且Y方向滑动的距离小于mSlop,表示可以滑动if (Math.abs(deltaX) > mSlop && Math.abs(deltaY) < mSlop) {mSwiping = true;// 当手指滑动item,取消item的点击事件,不然我们滑动Item也伴随着item点击事件的发生MotionEvent cancelEvent = MotionEvent.obtain(ev);cancelEvent.setAction(MotionEvent.ACTION_CANCEL| (ev.getActionIndex() << MotionEvent.ACTION_POINTER_INDEX_SHIFT));onTouchEvent(cancelEvent);}if (mSwiping) {// 手指滑动的时候,返回true,表示SwipeDismissListView自己处理onTouchEvent,其他的就交给父类来处理return true;}return super.onTouchEvent(ev);}public void setOnItemDeleteCallback(OnDeleteCallback onDeleteCallback) {this.onDeleteCallback = onDeleteCallback;}/** * 删除的回调接口 *  * @author xiaanming *  */public interface OnDeleteCallback {public void onDelete(AdapterView<?> parent, int deletePosition);}}


1 0