使用Ultra-Pull-To-Refresh下拉刷新时解决与嵌套的viewpager触摸滑动冲突的问题

 同样是在做的天气app中,使用了开源的Ultra-Pull-To-Refresh下拉刷新控件,由于在项目中有一个viewpager负责显示之后5天的天气预报,但加入Ultra-Pull-To-Refresh时产生了一个问题,就是viewpager左右滑动时非常的难,使用下面的代码可以解决问题:


1、自定义viewpager

package com.myzaker.autoinsurance.ui.view;  
  
import android.content.Context;  
import android.os.Debug;  
import android.support.v4.view.ViewPager;  
import android.util.AttributeSet;  
import android.view.MotionEvent;  
import android.view.ViewGroup;  
  
  
  
/** 
 * Created by Denny on 2015/8/1. 
 */  
public class DisallowParentTouchViewPager extends ViewPager {  
  
    private ViewGroup parent;  
  
    public DisallowParentTouchViewPager(Context context) {  
        super(context);  
    }  
  
    public DisallowParentTouchViewPager(Context context, AttributeSet attrs) {  
        super(context, attrs);  
    }  
  
    public void setNestParent(ViewGroup parent) {  
        this.parent = parent;  
    }  
  
    @Override  
    public boolean dispatchTouchEvent(MotionEvent ev) {  
        if (parent != null) {  
            parent.requestDisallowInterceptTouchEvent(true);  
        }  
        return super.dispatchTouchEvent(ev);  
    }  
  
    @Override  
    public boolean onInterceptTouchEvent(MotionEvent ev) {  
        if (parent != null) {  
            parent.requestDisallowInterceptTouchEvent(true);  
        }  
        return super.onInterceptTouchEvent(ev);  
    }  
  
    @Override  
    public boolean onTouchEvent(MotionEvent ev) {  
        if (parent != null) {  
            parent.requestDisallowInterceptTouchEvent(true);  
        }  
        return super.onTouchEvent(ev);  
    }  
}  
这段代码也很好理解,就是在处理ViewPager touch事件的时候把他的父组件的事件屏蔽掉,这样就只响应了ViewPager touch事件,其实主要是parent.requestDisallowInterceptTouchEvent(true);这句代码的作用,这个是android组件的约定,这个会一级一级的上传,让所有的父组件都不响应touch事件。 

但是在android-Ultra-Pull-To-Refresh的PtrFrameLayout上使用上面改造的ViewPager却没有效果,查看PtrFrameLayout源码发现他在实现dispatchTouchEvent方法时,没有考虑到FLAG_DISALLOW_INTERCEPT的因素,导致requestDisallowInterceptTouchEvent方法不起作用。OK,找到了问题点那就改造下PtrFrameLayout好了, 如下: 

package com.myzaker.autoinsurance.ui.view;  
  
import android.content.Context;  
import android.util.AttributeSet;  
import android.view.MotionEvent;  
  
import in.srain.cube.views.ptr.PtrFrameLayout;  
  
/** 
 * Created by Denny on 2015/8/1. 
 */  
public class FixRequestDisallowTouchEventPtrFrameLayout extends PtrFrameLayout {  
  
    private boolean disallowInterceptTouchEvent = false;  
  
    public FixRequestDisallowTouchEventPtrFrameLayout(Context context) {  
        super(context);  
    }  
  
    public FixRequestDisallowTouchEventPtrFrameLayout(Context context, AttributeSet attrs) {  
        super(context, attrs);  
    }  
  
    public FixRequestDisallowTouchEventPtrFrameLayout(Context context, AttributeSet attrs, int defStyle) {  
        super(context, attrs, defStyle);  
    }  
  
    @Override  
    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {  
        disallowInterceptTouchEvent = disallowIntercept;  
        super.requestDisallowInterceptTouchEvent(disallowIntercept);  
    }  
  
    @Override  
    public boolean dispatchTouchEvent(MotionEvent e) {  
        if (disallowInterceptTouchEvent) {  
            return dispatchTouchEventSupper(e);  
        }  
        return super.dispatchTouchEvent(e);  
    }  
}  

继承PtrFrameLayout,当如果调用了requestDisallowInterceptTouchEvent方法,那么dispatchTouchEvent方法就调用dispatchTouchEventSupper,这个其实就是ViewGroup中dispatchTouchEvent的实现。 OK,使用这个FixRequestDisallowTouchEventPtrFrameLayout和DisallowParentTouchViewPager类, 就解决了android-Ultra-Pull-To-Refresh下拉刷新组件和ViewPager事件冲突的问题。

你可能感兴趣的:(安卓)