關於ViewPager、ViewFilpper、ViewFlow三種實現水平向滑動方式的比較


實現簡介

ViewPager

ViewPager類提供了多界面切換的新效果。新效果有如下特征:

[1] 當前顯示一組界面中的其中一個界面。

[2] 當用戶通過左右滑動界面時,當前的屏幕顯示當前界面和下一個界面的一部分。

[3] 滑動結束后,界面自動跳轉到當前選擇的界面中

 

ViewPager來源於google 的補充組件android-support-v4.jar,位置在androidSDK文件夾

android-sdks\extras\android\support\ 下 

將android-support-v4.jar 引用到項目中

注:該包需要在Android SDK Manager中額外下載Extras下的Android Support package,

或直接下載該jar包到項目中引用

 

引入后可直接當作控件在項目中使用。

配置文件頁面文件

View Code
1 <android.support.v4.view.ViewPager
2 
3          android:id="@+id/viewPager1"
4 
5          android:layout_width="fill_parent"
6 
7          android:layout_height="fill_parent"
8 
9          android:layout_centerVertical="true"  />

 

初始化控件

View Code
1 viewPager1 = (ViewPager) findViewById(R.id.viewPager1); 
2 
3         viewPager1.setAdapter(new PageAdapter(new ArrayList<View>()));

 

配置適配器的頁面變化事件

View Code
 1 viewPager1
 2 
 3        .setOnPageChangeListener(new OnPageChangeListener() {
 4 
 5             //頁面選擇
 6 
 7 @Override
 8 
 9            public void onPageSelected(int position) {
10 
11               topText.setText(String.valueOf(position+1)+"/"+String.valueOf(lists.length));
12 
13            }
14 
15  
16 
17            @Override
18 
19            public void onPageScrollStateChanged(int state) {
20 
21            }
22 
23  
24 
25            @Override
26 
27            public void onPageScrolled(int position,
28 
29                   float positionOffset, int positionOffsetPixels) {
30 
31            }
32 
33        });

 

ViewPager使用的適配器基於PagerAdapter基類

主要實現一下四個方法

View Code
 1 //獲取當前窗體界面數
 2 
 3 public int getCount()
 4 
 5 //初始化position位置的界面
 6 
 7 public Object instantiateItem(View collection, int position)  
 8 
 9 //銷毀position位置的界面
10 
11 public void destroyItem(View collection, int position, Object view)
12 
13 // 判斷是否由對象生成界面
14 
15 public boolean isViewFromObject(View arg0, Object arg1)

 

ViewPager控件的使用中,可以將View裝如ArrayList中作為數據載體,每一項(即每一頁)

為一個View顯示,可以適應大量頁面或者變化的頁面長度的顯示

  

ViewFilpper

Viewfilpper控件主要用於在同一個Activity內屏幕見的切換,最長見的情況就是在一個FrameLayout內有多個頁面,比如一個系統設置頁面;一個個性化設置頁面。

 

ViewFilpper控件是系統自帶控件之一,主要是為兩個頁面間的切換設置動畫效果。ViewFilpper繼承自FrameLayout下的ViewAnimator,

 

android.widget.ViewAnimator類繼承至FrameLayout,ViewAnimator類的作用是為FrameLayout里面的View切換提供動畫效果。該類有如下幾個和動畫相關的函數: 
setInAnimation:設置View進入屏幕時候使用的動畫,該函數有兩個版本,一個接受單個參數,類型為android.view.animation.Animation;一個接受兩個參數,類型為Context和int,分別為Context對象和定義Animation的resourceID。
setOutAnimation: 設置View退出屏幕時候使用的動畫,參數setInAnimation函數一樣。 
showNext 調用該函數來顯示FrameLayout里面的下一個View。 
showPrevious 調用該函數來顯示FrameLayout里面的上一個View。 
 
一般不直接使用ViewAnimator而是使用它的兩個子類ViewFlipper和ViewSwitcher。ViewFlipper可以用來指定FrameLayout內多個View之間的切換效果,可以一次指定也可以每次切換的時候都指定單獨的效果。該類額外提供了如下幾個函數: 
 
isFlipping 用來判斷View切換是否正在進行 
setFilpInterval設置View之間切換的時間間隔 
startFlipping使用上面設置的時間間隔來開始切換所有的View,切換會循環進行 
stopFlipping: 停止View切換 

ViewFilpper的使用方法:

配置頁面文件

View Code
 1 <ViewFlipper
 2 
 3         android:id="@+id/flipper"
 4 
 5         android:layout_width="fill_parent"
 6 
 7         android:layout_height="fill_parent"
 8 
 9         android:layout_below="@+id/CockpitLayout" >
10 
11         <include
12 
13             android:id="@+id/secondlayout"
14 
15             layout="@layout/second" >
16 
17         </include>
18 
19         <include
20 
21             android:id="@+id/firstlayout"
22 
23             layout="@layout/first" >
24 
25         </include>
26 
27 </ViewFlipper>

 

配置好頁面文件后便可在代碼中對ViewFilpper進行操作和設置切換動畫

ViewFlow

android-viewflow 是 Android 平台上一個視圖切換的效果庫。

ViewFlow 相當於 Android UI 部件提供水平滾動的 ViewGroup,使用 Adapter 進行條目綁定。文檔上說,當你需要在一系列不確定數目的view中滑動時,可以考慮使用ViewFlow。如果你的view數目確定,你應該使用Fragments 或兼容庫里的ViewPager 。

 

1、使用ViewFlow

怎么使用呢?首先在你的layout文件中加入:

<org.taptwo.android.widget.ViewFlow

android:id="@+id/viewflow"

app:sidebuffer="5"

/>

其中app:sidebuffer屬性是ViewFlow組件自定義的,使用這些屬性時,需要增加如下的xml的命名空間:

xmlns:app="http://schemas.android.com/apk/res/your.application.package.here"

然后在你的Activity里面添加如下代碼用於使用ViewFlow:

View Code
 1 ViewFlow viewFlow = (ViewFlow) findViewById(R.id.viewflow);
 2 
 3 viewFlow.setAdapter(myAdapter);
 4 
 5 //設置初始view的位置
 6 
 7 //viewFlow.setAdapter(myAdapter, 8);
 8 
 9 //監聽view切換事件,簡單的需求可不監聽
10 
11 viewFlow.setOnViewSwitchListener(new ViewSwitchListener() {
12 
13     public void onSwitched(View v, int position) {
14 
15     / / Your code here
16 
17     }
18 
19 });

 

當然,你也可以使用該庫中的FlowIndicator為你在多個view中切換時提供一個指示器,目前該庫已經實現了兩種指示器:一種是圓點指示器FlowIndicator;另一種是標題指示器TitleFlowIndicator。

1、使用圓點指示器

圓點指示器可以這樣使用:
先在layout中這樣定義

View Code
1 <org.taptwo.android.widget.CircleFlowIndicator
2 
3 android:padding="10dip" android:layout_height="wrap_content"
4 
5 android:layout_width="wrap_content" android:id="@+id/viewflowindic"
6 
7 android:background="#00000000"
8 
9 />

 

然后在activity中調用它

View Code
1 CircleFlowIndicator indic = (CircleFlowIndicator)
2 
3                      findViewById(R.id.viewflowindic);
4 
5 viewFlow.setFlowIndicator(indic);

 

圓點指示器還支持activeColor、inactiveColor、activeType(填充或描邊)、inactiveType(填充或描邊)、fadeOut(設置圓點自動隱藏的秒數,若為0則不會自動隱藏)、radius(圓點的半徑)等。

2、使用標題指示器

標題指示器也是先layout里定義:

View Code
 1 <org.taptwo.android.widget.TitleFlowIndicator
 2 
 3 android:id="@+id/viewflowindic"
 4 
 5         android:layout_height="wrap_content"
 6 
 7 android:layout_width="fill_parent"
 8 
 9 app:footerLineHeight="2dp"
10 
11 app:footerTriangleHeight="10dp"
12 
13         app:textColor="#FFFFFFFF" app:selectedColor="#FFFFC445"
14 
15 app:footerColor="#FFFFC445" app:titlePadding="10dp"
16 
17         app:textSize="11dp" app:selectedSize="12dp"
18 
19 android:layout_marginTop="10dip"
20 
21 app:clipPadding="5dp" />

 

然后在activity中調用它:

View Code
1 TitleFlowIndicator indicator = (TitleFlowIndicator)
2 
3                           findViewById(R.id.viewflowindic);
4 
5 indicator.setTitleProvider(myTitleProvider);
6 
7 viewFlow.setFlowIndicator(indicator);

 

以上就是ViewFlow庫提供三大組件及其用法(來自其文檔),使用時需要下載到其代碼並放在你的項目中的某個包內,當然你也可以把該組件庫打包成jar調用。

 

比較

根據以上對三種實現的使用描述,可以看出,ViewPager與ViewFlow都能夠使用適配器進行大量數據的適配。並且ViewFlow也帶有原點和標題的位置提示,二者比較相像。ViewFilpper使用時主要是在有限的少數頁面切換中比較合適,並且能夠自定義每一個切換動畫,用於一個應用間的畫面切換比較合適,類似於ActivityGroup。

ViewFlow由於提供源碼,所以在擴展性上更強,可根據需要自行定制,比如加入循環播放等。


免責聲明!

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



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