Android自定義View——自定義ViewPager


 

第一部分:自定義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就完成了滑動沖突的處理,既能上下滑動和左右滑動


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM