編寫: roya 原文:https://developer.android.com/training/wearables/ui/2d-picker.html
Android Wear中的2D Picker模式允許用戶像換頁一樣從一組選項中導航和選擇。Wearable UI庫讓我們可以容易地用一個page grid來實現這個模式。其中,page grid是一個layout管理器,它允許用戶垂直和水平滾動頁面。
要實現這個模式,我們需要添加一個GridViewPager
元素到activity的layout中,然後實現一個繼承FragmentGridPagerAdapter
類的adapter以提供一組頁面。
Note: Android SDK中的GridViewPager例子示範瞭如何在應用中使用
GridViewPager
layout。這個例子的位於android-sdk/samples/android-20/wearable/GridViewPager
目錄中。
像下面一樣添加一個GridViewPager
元素到layout描述文件:
<android.support.wearable.view.GridViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
我們可以使用任何定義Layouts技術以保證2D picker可以工作在圓形和方形兩種設備上。
Page Adapter提供一組頁面以填充GridViewPager
部件。要實現這個adapter,需要繼承Wearable UI庫中的FragmentGridPageAdapter
類。
舉個例子,Android SDK內的GridViewPager例子中包含了下面的adapter實現,該實現提供一組靜態的具有自定義背景圖片的card:
public class SampleGridPagerAdapter extends FragmentGridPagerAdapter {
private final Context mContext;
public SampleGridPagerAdapter(Context ctx, FragmentManager fm) {
super(fm);
mContext = ctx;
}
static final int[] BG_IMAGES = new int[] {
R.drawable.debug_background_1, ...
R.drawable.debug_background_5
};
// A simple container for static data in each page
private static class Page {
// static resources
int titleRes;
int textRes;
int iconRes;
...
}
// Create a static set of pages in a 2D array
private final Page[][] PAGES = { ... };
// Override methods in FragmentGridPagerAdapter
...
}
picker調用getFragment
和getBackground
來取得內容以顯示到grid的每個位置中。
// Obtain the UI fragment at the specified position
@Override
public Fragment getFragment(int row, int col) {
Page page = PAGES[row][col];
String title =
page.titleRes != 0 ? mContext.getString(page.titleRes) : null;
String text =
page.textRes != 0 ? mContext.getString(page.textRes) : null;
CardFragment fragment = CardFragment.create(title, text, page.iconRes);
// Advanced settings (card gravity, card expansion/scrolling)
fragment.setCardGravity(page.cardGravity);
fragment.setExpansionEnabled(page.expansionEnabled);
fragment.setExpansionDirection(page.expansionDirection);
fragment.setExpansionFactor(page.expansionFactor);
return fragment;
}
// Obtain the background image for the page at the specified position
@Override
public ImageReference getBackground(int row, int column) {
return ImageReference.forDrawable(BG_IMAGES[row % BG_IMAGES.length]);
}
getRowCount
方法告訴picker有多少行內容是可獲得的,getColumnCount
方法告訴picker每行中有多少列內容是可獲得的。
// Obtain the number of pages (vertical)
@Override
public int getRowCount() {
return PAGES.length;
}
// Obtain the number of pages (horizontal)
@Override
public int getColumnCount(int rowNum) {
return PAGES[rowNum].length;
}
adapter是實現細節取決於我們指定的某組頁面。由adapter提供的每個頁面是Fragement
類型。在這個例子中,每個頁面是一個使用默認card layouts的CardFragment
實例。然而,我們可以在同一個2D picker混合不同類型的頁面,比如cards,action icons,和自定義layouts,由具體情況決定。
不是所有行都需要有同樣數量的頁面。注意這個例子中的每行有不同的列數。我們也可以用一個 GridViewPager
組件實現只有一行或一列的1D picker。
Figure 1: GridViewPager例子
對於那些超出設備屏幕大小的card,GridViewPager
為它們提供了滾動支持。這個例子配置了每張card可以按照需要進行展開,所以用戶可以滾動卡片的內容。當用戶滾動到card的盡頭,向同一方向滑動將顯示grid中的下一頁(如果下一頁存在的話)。
我們可以使用getBackground()
方法自定義每頁的背景。當用戶在頁面間滑動時,GridViewPager
自動在不同的背景之間使用視差滾動和淡出效果。
在activity中,分配一個adapter實現實例給GridViewPager
組件:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
final GridViewPager pager = (GridViewPager) findViewById(R.id.pager);
pager.setAdapter(new SampleGridPagerAdapter(this, getFragmentManager()));
}
}