1. 程式人生 > >viewpager跟HorizontalScrollView,listview衝突的問題

viewpager跟HorizontalScrollView,listview衝突的問題

這幾天做到一個小qpp,發現一個嚴重的問題,因為主要佈局是一個HorizontalScrollView裡面裝了個viewpager包含fragment,恰好我有又想實現一個側邊欄,所以發現app執行之後,側滑欄雖然能夠滑動,但是viewpager完全不能用了,不能滑動,就連tablelayout按鈕都不能用了,就上網查詢了下資料,原來是viewpager和HorizontalScrollView衝突了,HorizontalScrollView裡面viewpager的活動被HorizontalScrollView父view攔截了,所以我們為了能夠實現兩者的協調,必須分情況到底父view是否該攔截子view的活動。攔截了側滑欄就能活動,不攔截viewpager就能活動。


getParent().requestDisallowInterceptTouchEvent(true);把touch主動權交給子view處理,不攔截touch事件,也就是viewpager
getParent().requestDisallowInterceptTouchEvent(flse);把touch主動權交給父view處理,攔截touch事件,也就是HorizontalScrollView

 
具體程式碼如下:

 
package com.example.a1.myapplication.View;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;


public class ChildViewPager extends ViewPager {
    public ChildViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

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

    // 滑動距離及座標 歸還父控制元件焦點
    private float xDistance, yDistance, xLast, yLast,xDown, mLeft;

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        //把touch主動權交給子view處理,不攔截touch事件,也就是viewpager
        getParent().requestDisallowInterceptTouchEvent(true);
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                xDistance = yDistance = 0f;
                xLast = ev.getX();
                yLast = ev.getY();
                xDown = ev.getX();
                mLeft = ev.getX();
                // 解決與側邊欄滑動衝突
                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 (mLeft < 100 || xDistance < yDistance) {
                    getParent().requestDisallowInterceptTouchEvent(false);
                } else {
                    if (getCurrentItem() == 0) {
                        if (curX < xDown) {
                            getParent().requestDisallowInterceptTouchEvent(true);
                        } else {
                            getParent().requestDisallowInterceptTouchEvent(false);
                        }
                    } else if (getCurrentItem() == (getAdapter().getCount()-1)) {
                        if (curX > xDown) {
                            getParent().requestDisallowInterceptTouchEvent(true);
                        } else {
                            getParent().requestDisallowInterceptTouchEvent(false);
                        }
                    } else {
                        getParent().requestDisallowInterceptTouchEvent(true);
                    }
                }
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                break;
        }
        return super.dispatchTouchEvent(ev);
    }

}
在今後使用中只需要使用上述程式碼然後在layout佈局檔案中使用
 

 

 
            <com.hk.View.ChildViewPager
                android:id="@+id/pager"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                >
            </com.hk.ChildViewPager>

然後就ok了,而且你覺得想實現側滑欄實現的簡單點,可以刪除一些上面程式碼的東東西,當然listview也是同樣的道理,相信大神的你們都會領悟。