【Android】解決Listview側滑與上下滑動問題+側滑通用佈局 DragRelativeLayout

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

現在只做了左右滑動的效果,側滑刪除還沒實現,不過也應該蠻簡單了,加個刪除回調接口就行了


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章