今天抽空想自己寫個仿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);
}
}
現在只做了左右滑動的效果,側滑刪除還沒實現,不過也應該蠻簡單了,加個刪除回調接口就行了