天天看點

關于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包到項目中引用

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

配置檔案頁面檔案

<android.support.v4.view.ViewPager

android:id="@+id/viewPager1"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_centerVertical="true" />

初始化控件

viewPager1 = (ViewPager) findViewById(R.id.viewPager1);

viewPager1.setAdapter(new PageAdapter(new ArrayList<View>()));

配置擴充卡的頁面變化事件

viewPager1

.setOnPageChangeListener(new OnPageChangeListener() {

//頁面選擇

@Override

public void onPageSelected(int position) {

topText.setText(String.valueOf(position+1)+"/"+String.valueOf(lists.length));

}

public void onPageScrollStateChanged(int state) {

public void onPageScrolled(int position,

float positionOffset, int positionOffsetPixels) {

});

ViewPager使用的擴充卡基于PagerAdapter基類

主要實作一下四個方法

//擷取目前窗體界面數

public int getCount()

//初始化position位置的界面

public Object instantiateItem(View collection, int position)

//銷毀position位置的界面

public void destroyItem(View collection, int position, Object view)

// 判斷是否由對象生成界面

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的使用方法:

配置頁面檔案

<ViewFlipper

android:id="@+id/flipper"

android:layout_below="@+id/CockpitLayout" >

<include

android:id="@+id/secondlayout"

layout="@layout/second" >

</include>

android:id="@+id/firstlayout"

layout="@layout/first" >

</ViewFlipper>

配置好頁面檔案後便可在代碼中對ViewFilpper進行操作和設定切換動畫

ViewFlow

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

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

、使用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:

ViewFlow viewFlow = (ViewFlow) findViewById(R.id.viewflow);

viewFlow.setAdapter(myAdapter);

//設定初始view的位置

//viewFlow.setAdapter(myAdapter, 8);

//監聽view切換事件,簡單的需求可不監聽

viewFlow.setOnViewSwitchListener(new ViewSwitchListener() {

public void onSwitched(View v, int position) {

/ / Your code here

}

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

、使用圓點訓示器

圓點訓示器可以這樣使用:

先在layout中這樣定義

<org.taptwo.android.widget.CircleFlowIndicator

android:padding="10dip" android:layout_height="wrap_content"

android:layout_width="wrap_content" android:id="@+id/viewflowindic"

android:background="#00000000"

/>

然後在activity中調用它

CircleFlowIndicator indic = (CircleFlowIndicator)

findViewById(R.id.viewflowindic);

viewFlow.setFlowIndicator(indic);

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

、使用标題訓示器

标題訓示器也是先layout裡定義:

<org.taptwo.android.widget.TitleFlowIndicator

android:id="@+id/viewflowindic"

android:layout_height="wrap_content"

android:layout_width="fill_parent"

app:footerLineHeight="2dp"

app:footerTriangleHeight="10dp"

app:textColor="#FFFFFFFF" app:selectedColor="#FFFFC445"

app:footerColor="#FFFFC445" app:titlePadding="10dp"

app:textSize="11dp" app:selectedSize="12dp"

android:layout_marginTop="10dip"

app:clipPadding="5dp" />

然後在activity中調用它:

TitleFlowIndicator indicator = (TitleFlowIndicator)

indicator.setTitleProvider(myTitleProvider);

viewFlow.setFlowIndicator(indicator);

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

比較

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

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

繼續閱讀