今天抽空想自己写个仿QQ的列表项侧滑删除,重写完 item的onTouchEvent(),测试发现一个问题,item侧滑时,同时上下滑动,listview的触摸监听就会覆盖item,导致抬起手指动作item里面的监听无法执行,布局乱掉了。
解决问题办法:判断左右滑动,左右滑动时禁止listview上下滑动
代码:
// 判断是否为偏向左右的滑动
if (Math.abs(nowX - mDownX) > Math.abs(nowY - mDownY)) {
// 左右滑动请求消费该事件,防止上下滑动以及被ScrollView嵌套的手势冲突
requestDisallowInterceptTouchEvent(true);
}
下面是item布局,直接放到xml最外层就行
package com.xxx.myapplication.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.RelativeLayout;
/**
* 横向拖拽布局(延伸:侧滑删除)
* Created by lixiao on 2016/11/3 0003.
*/
public class DragRelativeLayout extends RelativeLayout {
public DragRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DragRelativeLayout(Context context) {
super(context);
}
int top;
int mDownX;
int mDownY;
View pointChild;
RelativeLayout.LayoutParams params;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction())
{
case MotionEvent.ACTION_DOWN:
mDownX =(int)event.getRawX();
mDownY =(int)event.getRawY();
// pointChild = getChildAt(0);
// params= (RelativeLayout.LayoutParams) pointChild.getLayoutParams();
pointChild = this;
top=pointChild.getTop();
Log.i("TAG", "DOWN: mDownX "+ mDownX);
Log.i("TAG", "DOWN: mDownY "+ mDownY);
break;
case MotionEvent.ACTION_MOVE:
int nowX = (int) event.getRawX();
int nowY = (int) event.getRawY();
int dx= (int) (mDownX -event.getRawX());
int dy= (int) (mDownY -event.getRawY());
// 判断是否为偏向左右的滑动
if (Math.abs(nowX - mDownX) > Math.abs(nowY - mDownY)) {
// 左右滑动请求消费该事件,防止上下滑动以及被ScrollView嵌套的手势冲突
requestDisallowInterceptTouchEvent(true);
Log.i("TAG", "ACTION_MOVE: dx " + dx);
int right = 0 + pointChild.getWidth() - dx;
int bottom = top + pointChild.getHeight();
pointChild.layout(0 - dx, top, right, bottom);
// params.leftMargin = -dx;
// pointChild.setLayoutParams(params);
return true;
}
break;
case MotionEvent.ACTION_UP:
// Log.i("TAG", "ACTION_UP: width "+v.getWidth());
// Log.i("TAG", "ACTION_UP: height "+v.getHeight());
pointChild.layout(0, top,0+pointChild.getWidth() , top+pointChild.getHeight());
// params.leftMargin = 0;
// pointChild.setLayoutParams(params);
break;
}
return super.onTouchEvent(event);
}
}
现在只做了左右滑动的效果,侧滑删除还没实现,不过也应该蛮简单了,加个删除回调接口就行了