【Android】解决Listview侧滑与上下滑动问题+侧滑通用布局 DragRelativeLayout

来源:互联网 发布:融合交换机软件下载 编辑:程序博客网 时间:2024/05/29 11:32

今天抽空想自己写个仿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);    }}

现在只做了左右滑动的效果,侧滑删除还没实现,不过也应该蛮简单了,加个删除回调接口就行了


0 0
原创粉丝点击