實現子view滑動一段距離後,讓父view進行滑動

思路分析

1.開始子view需要滑動,所以要獲取事件,即此時父view不能攔截事件
2. 後期父view需要滑動,此時父view需要進行攔截,獲取事件

將上面的分析轉化爲僞代碼:

//子view
    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
            	//進行反攔截,保證子view獲取down事件, 否則後續事件無法獲取
                parent.requestDisallowInterceptTouchEvent(true);
                break;
            case MotionEvent.ACTION_MOVE:
	            if(子view需要滑動){//禁止父view攔截
					parent.requestDisallowInterceptTouchEvent(true);
				}else {//允許父view攔截事件
                    parent.requestDisallowInterceptTouchEvent(false);
                }
                break;
            case MotionEvent.ACTION_UP:
                
                break;
            default:
                break;
        }
        return super.dispatchTouchEvent(event);
    }

//父view
public boolean onInterceptTouchEvent(MotionEvent event){
	int action = event.getAction();
	if(action == MotionEvent.ACTION_DOWN){
		return false;
	}else{
		return true;
	}
}

場景示例

這類場景,父view一般都是ScrollView,內部已經有事件處理,只需關注子view就行。如ScrollView嵌套ScrollView或ListView,只需重寫子view的dispatchTouchEvent方法即可:


    private float downY;

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                downY = event.getY();
                getParent().requestDisallowInterceptTouchEvent(true);
                break;
            case MotionEvent.ACTION_MOVE:
                if(Math.abs(downY - event.getY()) < 200){
                    getParent().requestDisallowInterceptTouchEvent(true);
                }else {
                    getParent().requestDisallowInterceptTouchEvent(false);
                }
                break;
            case MotionEvent.ACTION_UP:
                break;
            default:
                break;
        }
        return super.dispatchTouchEvent(event);
    }

demo地址

https://github.com/chaoyangsun/SildingConflict

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