Android ViewPager和ScrollView嵌套滾動問題解決方案

來源:互聯網
上載者:User

標籤:

問題描述:

  1. 我的嵌套是ViewPager-->ScrollView-->ViewPager.


  2. 首先最裡面的ViewPager水平滾動時總是會觸發最外層的ViewPager滾動,看了網上很多的解決辦法基本上是一樣的,需要自訂ViewPager。

import android.content.Context;import android.graphics.PointF;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.view.MotionEvent;/** * 自訂ViewPager,解決ViewPagger嵌套使用時不滑動問題。 * Created by Administrator on 2015/4/20. */public class HorizontalInnerViewPager extends ViewPager {    /** 觸摸時按下的點 **/    PointF downP = new PointF();    /** 觸摸時當前的點 **/    PointF curP = new PointF();    public HorizontalInnerViewPager(Context context, AttributeSet attrs) {        super(context, attrs);        mGestureDetector = new GestureDetector(context, new XScrollDetector());    }    public HorizontalInnerViewPager(Context context) {        super(context);        mGestureDetector = new GestureDetector(context, new XScrollDetector());    }    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        return super.onInterceptTouchEvent(ev);//default    }    @Override    public boolean onTouchEvent(MotionEvent ev) {        //每次進行onTouch事件都記錄當前的按下的座標        curP.x = ev.getX();        curP.y = ev.getY();        if(ev.getAction() == MotionEvent.ACTION_DOWN){            //記錄按下時候的座標            //切記不可用 downP = curP ,這樣在改變curP的時候,downP也會改變            downP.x = ev.getX();            downP.y = ev.getY();            //此句代碼是為了通知他的父ViewPager現在進行的是本控制項的操作,不要對我的操作進行幹擾            getParent().requestDisallowInterceptTouchEvent(true);        }        if(ev.getAction() == MotionEvent.ACTION_MOVE){            //此句代碼是為了通知他的父ViewPager現在進行的是本控制項的操作,不要對我的操作進行幹擾                getParent().requestDisallowInterceptTouchEvent(true);        }        return super.onTouchEvent(ev);    }}


3.解決了上面的問題,又出現了新的問題,當最裡面的ViewPager垂直滾動時外層的ScrollView並不會滾動,解決方案如下:

import android.content.Context;import android.graphics.PointF;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.view.GestureDetector;import android.view.MotionEvent;/** * 自訂ViewPager,解決ViewPagger嵌套使用時不滑動問題。 * Created by Administrator on 2015/4/20. */public class HorizontalInnerViewPager extends ViewPager {    /** 觸摸時按下的點 **/    PointF downP = new PointF();    /** 觸摸時當前的點 **/    PointF curP = new PointF();    /** 自訂手勢**/    private GestureDetector mGestureDetector;    public HorizontalInnerViewPager(Context context, AttributeSet attrs) {        super(context, attrs);        mGestureDetector = new GestureDetector(context, new XScrollDetector());    }    public HorizontalInnerViewPager(Context context) {        super(context);        mGestureDetector = new GestureDetector(context, new XScrollDetector());    }    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        return super.onInterceptTouchEvent(ev);//default        //當攔截觸摸事件到達此位置的時候,返回true,        //說明將onTouch攔截在此控制項,進而執行此控制項的onTouchEvent//        return true;        //接近水平滑動時子控制項處理該事件,否則交給父控制項處理//        return mGestureDetector.onTouchEvent(ev);    }    @Override    public boolean onTouchEvent(MotionEvent ev) {        //每次進行onTouch事件都記錄當前的按下的座標        curP.x = ev.getX();        curP.y = ev.getY();        if(ev.getAction() == MotionEvent.ACTION_DOWN){            //記錄按下時候的座標            //切記不可用 downP = curP ,這樣在改變curP的時候,downP也會改變            downP.x = ev.getX();            downP.y = ev.getY();            //此句代碼是為了通知他的父ViewPager現在進行的是本控制項的操作,不要對我的操作進行幹擾            getParent().requestDisallowInterceptTouchEvent(true);        }        if(ev.getAction() == MotionEvent.ACTION_MOVE){            float distanceX = curP.x - downP.x;            float distanceY = curP.y - downP.y;            //接近水平滑動,ViewPager控制項捕獲手勢,水平滾動            if(Math.abs(distanceX) > Math.abs(distanceY)){                //此句代碼是為了通知他的父ViewPager現在進行的是本控制項的操作,不要對我的操作進行幹擾                getParent().requestDisallowInterceptTouchEvent(true);            }else{                //接近垂直滑動,交給父控制項處理                getParent().requestDisallowInterceptTouchEvent(false);            }        }        return super.onTouchEvent(ev);    }    private class XScrollDetector extends GestureDetector.SimpleOnGestureListener{        @Override        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {//            return super.onScroll(e1, e2, distanceX, distanceY);            //接近水平滑動時子控制項處理該事件,否則交給父控制項處理            return (Math.abs(distanceX) > Math.abs(distanceY));        }    }}



Android ViewPager和ScrollView嵌套滾動問題解決方案

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.