1. 程式人生 > >解決ScrollView巢狀viewPager中巢狀listView滑動事件衝突問題(水平方向)

解決ScrollView巢狀viewPager中巢狀listView滑動事件衝突問題(水平方向)

我們在開發中經常會碰到view滑動衝突的情況。

滑動衝突的解決辦法就兩種:

1.外部攔截法:是指在點選事件先經過父容器的攔截處理,如果父容器需要處理此事件就進行攔截,如果不需要此事件就不攔截,這樣就可以解決滑動衝突的問題,外部攔截法需要重寫父容器的onInterceptTouchEvent()方法,在內部做相應攔截處理。

2.內部攔截法:是指點選事件先經過子View處理,如果子view需要次事件就直接消耗掉,否則就交給父容器進行處理,這樣就可以解決滑動衝突的問題。內部攔截需要配合requestDisallowInterceptTouchEvent()方法,來確定子view是否允許父容器攔截事件。

    a.允許父容器進行事件攔截

        getParent().requestDisallowInterceptTouchEvent(false)

    b.禁止父容器進行事件攔截

        getParent().requestDisallowInterceptTouchEvent(true)

以上是解決滑動衝突的方法,下面我們回到我們今天解決的正題ScrollView巢狀viewPager中巢狀listView滑動事件衝突

這裡可以使用第一種解決方案:外部攔截法

只需要自定義一個ScrollView,然後重寫它的onInterceptTouchEvent()即可,程式碼如下:

public class VerticalScrollView extends 
ScrollView { private float xDistance, yDistance, xLast, yLast; public VerticalScrollView(Context context) { super(context); } public VerticalScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public VerticalScrollView(Context context, AttributeSet attrs, int
defStyle) { super(context, attrs, defStyle); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: xDistance = yDistance = 0f; xLast = ev.getX(); yLast = ev.getY(); break; case MotionEvent.ACTION_MOVE: final float curX = ev.getX(); final float curY = ev.getY(); xDistance += Math.abs(curX - xLast); yDistance += Math.abs(curY - yLast); xLast = curX; yLast = curY; if (xDistance > yDistance) { return false; } } return super.onInterceptTouchEvent(ev); } }

第二種解決方案如下:不需要自定義控制元件

1.第一步:允許父容器進行事件攔截

scrollView.setOnScrollToBottomLintener(new BottomScrollView.OnScrollToBottomListener() {
    @Override
public void onScrollBottomListener(boolean isBottom) {
        if (isBottom) {
            scrollView.setOnTouchListener(new View.OnTouchListener() {
                @Override
public boolean onTouch(View v, MotionEvent event) {
                    switch (event.getAction()) {
                        case MotionEvent.ACTION_MOVE:
                            //解決滑動衝突
scrollView.getParent().requestDisallowInterceptTouchEvent(false);
                            break;
}
                    return false;
}
            });
}
    }
});

2.第二步:父元素也要預設攔截除了ACTION_DOWN以外的其他事件,這樣當子元素呼叫

scrollView.getParent().requestDisallowInterceptTouchEvent(false)

方法時,父元素才能繼續攔截所需的事件。

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    int action = ev.getAction();
    return action != MotionEvent.ACTION_DOWN; 
}

3.為什麼父容器不能攔截ACTION_DOWN事件呢?

    因為ACTION_DOWN事件並不受FLAG_DISALLOW_INTERCEPT這個標記位的控制,所以一旦父容器攔截ACTION_DOWN事件,那麼所有的事件都無法傳遞到子元素中去,這樣內部攔截就無法起作用了。


相關推薦

解決ScrollViewviewPagerlistView滑動事件衝突問題(水平方向)

我們在開發中經常會碰到view滑動衝突的情況。滑動衝突的解決辦法就兩種:1.外部攔截法:是指在點選事件先經過父容器的攔截處理,如果父容器需要處理此事件就進行攔截,如果不需要此事件就不攔截,這樣就可以解決滑動衝突的問題,外部攔截法需要重寫父容器的onInterceptTouch

解決androidviewpager和內嵌html滑動事件衝突

           這幾天專案迭代,有個大的板塊是整體套用H5來做。由於H5裡還有好多小模組,需要一個滑動切換的效果,而android端只是提供一個空的fragment,佔據著viewpager的一個板塊。最開始的效果滑動起來分外尷尬。。           解決思路是這

完美解決HorizontalScrollView與ListView滑動事件衝突

HorizontalScrollView與ListView滑動事件衝突,導致ListView下拉不靈敏。下面給出一種比較完美的實現方式,如果是縱向的ScrollView,對應改一下就好了~~上程式碼pa

ViewpagerListView

原文地址:http://spacetech.dk/android-viewpager-with-listview-pages.html MainActivity package com.example.koreancoursetest; import java.util.

ViewPageractivity頁面

做專案使用ViewPager顯示頁面遇到一個問題,就是當一個activity對應的xml頁面使用了ViewPager控制元件,並且控制元件中的子頁面也是activity頁面時,子頁面的事件如果使用匿名內部類方式,會直接執行不到,如果使用onClick方式,這時候會提示在父

RecyclerViewViewPagerRecyclerView滑動問題

RecyclerView頭部巢狀ViewPager,ViewPager內放Fragment,Fragment再放RecyclerView時,其實就是RecyclerView巢狀Viewpager再巢狀RecyclerView,這個時候滑動外面的RecyclerView的時候,

ScrollViewListView處理事件衝突

當ListView巢狀在ScrollView中時會有兩個問題 列表內容顯示不全 滑動事件衝突 第二個問題就是下面要講的廢話了。 一、首先要實現的效果是 手指在ListView中滑動時,滑動事件要交給ListView來處理,也就是說手指在

ScrollViewviewpager滑動事件衝突,與點選事情衝突解決方案

在產品適配的時候我加了ScrollView,但是產品提出了一個向上輪播需求 首先把豎直向上的viewpager粘出來: package com.cfiigroup.zhehui.hepaidai.view; import android.view.MotionEvent; impo

SwipeRefreshLayout與ViewPager滑動事件衝突解決

問題描述:開發中發現,SwipeRefreshLayout的下拉重新整理,與ViewPager開發的banner的左右滑動事件有一點衝突,導致banner的左右滑動不夠順暢。很容易在banner的左右滑動的過程中,觸發SwipeRefreshLayout的下拉重新整理,從而導

Android ListviewButton按鈕點選事件衝突解決辦法

 今天做專案時,ListView中含有了Button元件,心裡一早就知道肯定會有衝突,因為以前就遇到過,並解決過,可惜當時沒有記錄下來。 今天在做的時候,繼續被這個問題鬱悶了一把,後來解決後,趕緊來記錄下,以便日後參考。   首先,其實Listview中Button按

Android onTouch、OnLongClick、onClick及ScrollView滑動事件衝突

        最近要實現一個長按錄音,鬆開手指結束錄音的功能,在專案中,弄來弄去繞暈了,寫個demo來梳理下。順便研究下android事件呼叫機制。   先上效果介面: 佈局:     <Relat

C#之ListView開啟虛擬模式,報錯:其他資訊: 處於 VirtualMode 時,ListView RetrieveVirtualListItem 事件需要每個 ListView 列的列表檢視

二〇一八年十一月十日 21:54:49 1、環境: VS 2010 + C#  + ListView虛擬模式 + winform 2、報錯: 其他資訊: 處於 VirtualMode 中時,ListView RetrieveVirtualListItem 事件需要每個

微信小程式顯示載入彈窗(showLoading)的過程攔截圖幕滑動事件

        這篇文章對於熟悉小程式開發的人或者說熟悉開發文件的人來說簡直就是雞肋,因為沒有技術性可言。不過,對於像我這種入門者而且沒有多看文件的人來說,多少會有些用,思考再三還是寫篇文章記錄下好了,沒有惡意刷存在感[笑哭.gif]。        場景是這樣的:我的頁面中

解決view 滑動事件衝突(實戰篇-內部攔截法)

出處 Android開發藝術探索 說明:本文用的方法是(內部攔截法) 首先說下一個普遍的需求: 這個需求很普遍;像今日頭條,網易新聞什麼的都是這樣 1:底部有四個按鈕點選可以切換;左右滑可以切換(不用想用viewpager) 2:點選某個底部按鈕裡面又

CoordinatorLayout+ViewPager+SwipeRefreshLayout滑動事件衝突的處理

只是一個搬運工 連結 參考 程式碼(自己加的註釋,好多不懂,勿噴) public class NestedScrollSwipeRefreshLayout extends SwipeRefreshLayout implements Nes

android 滑動事件衝突解決 Touch事件處理機制

android中的事件型別分為按鍵事件和螢幕觸控事件,Touch事件是螢幕觸控事件的基礎事件,有必要對它進行深入的瞭解。 一個最簡單的螢幕觸控動作觸發了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->AC

解決SwipeRefreshLayout和ScrollViewViewPager卡頓問題

autoCycleViewPager.setOnTouchListener(this); int downX; int downY; int dragthreshold = 30; @Overrid

解決scrollView編輯框導致不能上下滑動的問題

EditText設定maxLines之後,文字行數超過maxLines,會網上摺疊,上下滑動能夠瀏覽全部文字。 若EditText外層有scrollView。在EditText上下滑動,不會像正常情況那樣上。僅僅會滑動了scrollView。 解決的方法是:

fragment ScrollView 同時viewpager banner和 listviewscrollview 滑動異常·

fragment中 ScrollView                      同時巢狀viewpager banner和        &nbs

android ScrollViewGridView,ListView只顯示一行的解決辦法

注:本文是由網上大神分享的解決方案彙集而成 方法一: 重寫ListView、GridView: 重寫ListView: public class MyListView extends ListView { public MyListView(Context contex