fc2ブログ

Programming Memo

Androidを中心としたJavaプログラミングを通して学んだことなどの覚書(にする予定)

GridViewのstretchModeについて

GridViewの「stretchMode」の値によって、グリッド表示がどのように変化するのかを「android:numColumns="3"」の場合で試してみた。

結果は以下の通り。

android:stretchMode="none"
grid_none.png

android:stretchMode="columnWidth"
grid_columnWidth.png

android:stretchMode="spacingWidth"
grid_spacingWidth.png

android:stretchMode="spacingWidthUniform"
grid_spacingWidthUniform.png

GridViewのソースを確認したところ、主に、determineColumnsメソッド(841行目~906行目)内でstretchModeの値による処理内容が決められていることがわかった。
    private void determineColumns(int availableSpace) {
        final int requestedHorizontalSpacing = mRequestedHorizontalSpacing;
        final int stretchMode = mStretchMode;
        final int requestedColumnWidth = mRequestedColumnWidth;
        
        if (mRequestedNumColumns == AUTO_FIT) {
            if (requestedColumnWidth > 0) {
                // Client told us to pick the number of columns
                mNumColumns = (availableSpace + requestedHorizontalSpacing) /
                        (requestedColumnWidth + requestedHorizontalSpacing);
            } else {
                // Just make up a number if we don't have enough info
                mNumColumns = 2;
            }
        } else {
            // We picked the columns
            mNumColumns = mRequestedNumColumns;
        }
        
        if (mNumColumns <= 0) {
            mNumColumns = 1;
        }

        switch (stretchMode) {
        case NO_STRETCH:
            // Nobody stretches
            mColumnWidth = requestedColumnWidth;
            mHorizontalSpacing = requestedHorizontalSpacing;
            break;

        default:
            int spaceLeftOver = availableSpace - (mNumColumns * requestedColumnWidth) -
                    ((mNumColumns - 1) * requestedHorizontalSpacing);
            switch (stretchMode) {
            case STRETCH_COLUMN_WIDTH:
                // Stretch the columns
                mColumnWidth = requestedColumnWidth + spaceLeftOver / mNumColumns;
                mHorizontalSpacing = requestedHorizontalSpacing;
                break;

            case STRETCH_SPACING:
                // Stretch the spacing between columns
                mColumnWidth = requestedColumnWidth;
                if (mNumColumns > 1) {
                    mHorizontalSpacing = requestedHorizontalSpacing + 
                        spaceLeftOver / (mNumColumns - 1);
                } else {
                    mHorizontalSpacing = requestedHorizontalSpacing + spaceLeftOver;
                }
                break;

            case STRETCH_SPACING_UNIFORM:
                // Stretch the spacing between columns
                mColumnWidth = requestedColumnWidth;
                if (mNumColumns > 1) {
                    mHorizontalSpacing = requestedHorizontalSpacing + 
                        spaceLeftOver / (mNumColumns + 1);
                } else {
                    mHorizontalSpacing = requestedHorizontalSpacing + spaceLeftOver;
                }
                break;
            }

            break;
        }
    }
要するに、GridViewでは各行について「余ったスペース」をうまく配分して表示するようになっているところ、この配分方法を決定するのがstretchModeの役割のようだ

わかりやすく図示すると以下のようになる。

grid_none_ppt.png

grid_columnWidth_ppt.png

grid_spacingWidth_ppt.png

grid_spacingWidthUniform_ppt.png

stretchMode="spacingWidthUniform"の場合に、先頭要素の表示位置が右にずれてるのはmakeRowメソッドの
        int nextLeft = mListPadding.left +
                ((mStretchMode == STRETCH_SPACING_UNIFORM) ? horizontalSpacing : 0);
の処理のためですね。

しかし、spacingWidthUniformは表示が右に偏りすぎだけど、これ誰が使うの??

おそらくだけど、
                    mHorizontalSpacing = requestedHorizontalSpacing + 
                        spaceLeftOver / (mNumColumns + 1);
の部分は、正しくは
                    mHorizontalSpacing = (requestedHorizontalSpacing * (nNumColumns - 1) + 
                        spaceLeftOver) / (mNumColumns + 1);
として下図のように均等配置したかったんじゃないのかなあ?? grid_spacingWidthUniform_ppt2.png

ま、stretchModeの値はデフォルトで"columnWidth"となってるし、ここはおとなしくcolumnWidthを使いましょうかね。

いつになく気合の入った記事になってしまった。でもまあ、紙メモだけじゃ絶対に忘却するから、これくらいしないと覚書にはならんのよね。

スポンサーサイト



  1. 2011/03/08(火) 01:46:12|
  2. Android
  3. | トラックバック:0
  4. | コメント:0
<<SimpleCursorAdapterの応用(1) | ホーム | ListViewの下にフッターを表示させる方法>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://tmken2.blog95.fc2.com/tb.php/14-54155a5c
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

TMken2

Author:TMken2
FC2ブログへようこそ!

最新記事

月別アーカイブ

カテゴリ

未分類 (0)
Eclipse (2)
Syntax Highlighter (2)
アルゴリズム (1)
Java (2)
Android (20)
覚書 (1)
SQLite (2)

アクセスカウンタ

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する