解決ViewPager雙層嵌套的滑動問題

今天我分享一下ViewPager的雙層嵌套時影響內(nèi)部ViewPager的觸摸滑動問題。

之前在做自己的一個項目的時候,遇到廣告欄圖片動態(tài)切換蝗敢,我第一時間想到的就是ViewPager逗堵,整個軟件只有廣告這一部分ViewPager還好說叶眉,但是軟件越復(fù)雜出現(xiàn)的問題越多慷妙,尤其是遇到ViewPager雙層嵌套問題,找了很多資料


解決方法一:自定義ViewPager做為父ViewPager控件

public class ParentViewPager extends ViewPager {
    private int childVPHeight = 0;

    public ParentViewPager(Context context) {
        super(context);
        init(context);
    }

    public ParentViewPager(Context context, AttributeSet attrs) {
        super(context, attrs); 
        init(context);
    }

    private void init(Context context) {
        // 獲取屏幕寬高
        WindowManager windowManager = (WindowManager) context.getSystemService(context.WINDOW_SERVICE);
        int disWidth = windowManager.getDefaultDisplay().getWidth();
        // 根據(jù)屏幕的密度來過去dp值相應(yīng)的px值
        childVPHeight = (int) (context.getResources().getDisplayMetrics().density * disWidth + 0.5f);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent arg0) {
        // 觸摸在子ViewPager所在的頁面和子ViewPager控件高度之內(nèi)時
        // 返回false允悦,此時將會將觸摸的動作傳給子ViewPager
        if (getCurrentItem() == 1 && arg0.getY() < childVPHeight) {
            return false;
        }
        return super.onInterceptTouchEvent(arg0);
    }
}

此方法雖然簡單可行膝擂,但是會出現(xiàn)虑啤,子ViewPager如果為ScrollView的時候,子ViewPager雖然已經(jīng)滑動到看不到的地方架馋,但是設(shè)定的高度內(nèi)還是不能讓父ViewPager左右滑動狞山,onTouch的動作透過了父Viewpager傳遞到了子控件


解決方法二:自定義Viewpager做為子控件

public class ChildViewPager extends ViewPager {
    /** 觸摸時按下的點 **/
    PointF downP = new PointF();
    /** 觸摸時當前的點 **/
    PointF curP = new PointF();
    
    OnSingleTouchListener onSingleTouchListener;
    
    public ChildViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ChildViewPager(Context context) {
        super(context);
    }

    @Override
    public boolean onTouchEvent(MotionEvent arg0) {
        // 每次進行onTouch事件都記錄當前的按下的坐標
        curP.x = arg0.getX();
        curP.y = arg0.getY();
        if (arg0.getAction() == MotionEvent.ACTION_DOWN) {
            // 記錄按下時候的坐標
            // 切記不可用 downP = curP ,這樣在改變curP的時候叉寂,downP也會改變
            downP.x = arg0.getX();
            downP.y = arg0.getY();
            // 此句代碼是為了通知他的父ViewPager現(xiàn)在進行的是本控件的操作萍启,不要對我的操作進行干擾
            getParent().requestDisallowInterceptTouchEvent(true);
        }
        int curIndex = getCurrentItem();
        if (curIndex == 0) {
            if (downP.x <= curP.x) {
                getParent().requestDisallowInterceptTouchEvent(false);
            } else {
                getParent().requestDisallowInterceptTouchEvent(true);
            }
        } else if (curIndex == getAdapter().getCount() - 1) {
            if (downP.x >= curP.x) {
                getParent().requestDisallowInterceptTouchEvent(false);
            } else {
                getParent().requestDisallowInterceptTouchEvent(true);
            }
        } else {
            getParent().requestDisallowInterceptTouchEvent(true);
        }

        if (arg0.getAction() == MotionEvent.ACTION_UP) {
            // 在up時判斷是否按下和松手的坐標為一個點
            // 如果是一個點,將執(zhí)行點擊事件屏鳍,這是我自己寫的點擊事件勘纯,而不是onclick
            if (downP.x == curP.x && downP.y == curP.y) {
                onSingleTouch();
                return true;
            }
        }
        return super.onTouchEvent(arg0);
    }

    /** * 單擊 */
    public void onSingleTouch() {
        if (onSingleTouchListener != null) {
            onSingleTouchListener.onSingleTouch();
        }
    }

    /** * 創(chuàng)建點擊事件接口 */
    public interface OnSingleTouchListener {
        public void onSingleTouch();
    }

    public void setOnSingleTouchListener(
            OnSingleTouchListener onSingleTouchListener) {
        this.onSingleTouchListener = onSingleTouchListener;
    }
} 

為什么要自己定義onSingleTouch呢?
因為在ViewPager的onTouchEvent中我對onDown進行了操作钓瞭,進行了操作后就無法將touch事件繼續(xù)往下傳給onClick和其內(nèi)部控件的任何事件驳遵,所以自己做了判斷,做了個singleTouch來實現(xiàn)點擊的事件
方法二可以完美解決雙層ViewPager嵌套后子ViewPager的觸摸滑動問題山涡,并實現(xiàn)了類似網(wǎng)易新聞的那樣堤结,可以在子view滑動到邊緣時,滑動父層

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸭丛,一起剝皮案震驚了整個濱河市竞穷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鳞溉,老刑警劉巖瘾带,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異穿挨,居然都是意外死亡月弛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門科盛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帽衙,“玉大人,你說我怎么就攤上這事贞绵±髀埽” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵榨崩,是天一觀的道長谴垫。 經(jīng)常有香客問我,道長母蛛,這世上最難降的妖魔是什么翩剪? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮彩郊,結(jié)果婚禮上前弯,老公的妹妹穿的比我還像新娘蚪缀。我一直安慰自己,他們只是感情好恕出,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布询枚。 她就那樣靜靜地躺著,像睡著了一般浙巫。 火紅的嫁衣襯著肌膚如雪金蜀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天的畴,我揣著相機與錄音渊抄,去河邊找鬼。 笑死苗傅,一個胖子當著我的面吹牛抒线,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播渣慕,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼嘶炭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了逊桦?” 一聲冷哼從身側(cè)響起眨猎,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎强经,沒想到半個月后睡陪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡匿情,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年兰迫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炬称。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡汁果,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出玲躯,到底是詐尸還是另有隱情据德,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布跷车,位于F島的核電站棘利,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏朽缴。R本人自食惡果不足惜善玫,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望密强。 院中可真熱鬧蝌焚,春花似錦裹唆、人聲如沸誓斥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劳坑。三九已至毕谴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間距芬,已是汗流浹背涝开。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留框仔,地道東北人舀武。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像离斩,于是被迫代替她去往敵國和親银舱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容