第一部分:自定義ViewGroup的使用,手勢識別器和Scroller滑動
第二部分:處理滑動監聽,處理滑動沖突,增加ViewPager的指示器
常見的滑動沖突:外部滑動方向和內部滑動方向不一致、外部滑動方向和內部滑動方向一致。
我們自定義的ViewPager如果在其中一頁中存在ListView,那么就需要解決滑動沖突的問題。
由於系統自帶ViewPager中,自己已經解決了滑動沖突。
1、創建一個類,繼承ViewGroup,由於ViewPager里面包含多個子View,所以繼承這個類,實現onLayout方法
onLayout:這個方法是對我們該View的一個位置擺放,這里可以看到onLayout這(int l,int t,int r,int b)這四個參數,分別代表着這個ViewPager的左上右下的位置,由於你引用ViewPager是match_parent,所以l和t為0,r和b為寬和高的距離
2、我們在自己的Activity中引用自定義的這個組件
3、復制幾張圖片作為演示,並為他們創建Id數組
4、接着我們需要對圖片進行初始化,並加入到ViewPager中,我們寫個初始化方法,並將他們放在構造方法中
5、這個時候,啟動程序,你是看不到有圖片出現的,因為你還沒有對這幾張圖片進行位置的擺放,所以需要在onLayout中進行位置處理
這樣處理的好處就是將圖片一字排開

6、現在已經排好了圖片,接着我們就來處理滑動事件了,我們通過一個手勢識別器自動幫我們識別滑動事件
通過onTouchEvent委托給手勢識別器,並且返回true,讓這個控件消耗這個事件
這個時候我們就可以看下效果圖

7、我們看到跟ViewPager還差一點,就是滑到第幾張就自動復原和不能超出頭和尾部的圖片,這時就要處理滑動事件了
效果圖

8、基本效果已經出來了,就是沒有很自然的滑動過去,那么這個時候就要用到scroller了
可以將ScrollTo替換掉了,讓它自然滑動
使用invalidate這個方法會有執行一個回調方法computeScroll,我們來重寫這個方法
其實Scroller的原理就是用ScrollTo來一段一段的進行,最后看上去跟自然的一樣,必須使用postInvalidate,這樣才會一直回調computeScroll這個方法,直到滑動結束。基本上ViewPager的效果就出來了,看下效果圖:
以下是這一部分的整個類的源碼
1、接下來介紹指示器的完成,指示器用RadioButton來實現,在xml中編寫RadioGroup
2、在主頁面中對RadioButton初始化
3、回到我們的MyViewPager類,創建ViewPager的監聽事件接口
4、創建ViewPager設置頁面的方法,並調用接口的onPagerChange方法
這個時候,滑動事件處理就可以用setCurrentItem方法來替代
5、回到Activity中進行綁定事件
這樣就完成了切換效果,看效果圖

1、我們在ViewPager中嵌套一個ScrollView作為它的子View,這樣ViewPager是左右滑動,ScrollView是上下滑動,那么就造成了滑動沖突
創建一個ScrollView的xml文件
2、在主界面中添加這個頁面到ViewPager中,同時增加一個RadioButton
這個時候你可以看到增加了一個頁面,但是頁面是空白的:由於ViewGroup只遍歷它的一個子View(即在這里的ScrollView),並不會去遍歷ScrollView里面的內容,所以必須重寫它的onMeasure方法,對ScrollView的子View進行遍歷
查看效果圖

這個時候你會發現這個頁面只能上下滑動不能左右滑動,所以需要處理滑動事件沖突
3、重寫父控件的onInterceptTouchEvent方法,如果是左右滑動,蘇越我們的父控件就把滑動事件攔截下來
這個時候還需要把將ACTION_DOWN傳遞給手勢識別器,因為攔截了MOVE的事件后,DOWN的事件也要給攔截給手勢識別器,否則會丟失事件
到現在,ViewPager就完成了滑動沖突的處理,既能上下滑動和左右滑動了

