1

画面サイズが何であれ、完全に収まるグリッドビューを作成しようとしています。この主題に関する多くの例またはSOの回答を読んだとき、私が見つけた唯一のことは、いくつかの「dimensions.xml」ファイルを各values-sizeフォルダーに配置し、gridviewに列数と自動魔法の間隔を適応させることです。問題は、間隔が大きすぎて、結果が非​​常に醜い場合があることです。

私の質問は次のとおりです。サイズを入れたくない場合、グリッドビューをピクセル精度で管理したい場合はどうすればよいですか? どんな例でも歓迎されます。

明確にするために:たとえば、各列の間に4ピクセルのスペーサーを持つx列が必要なため、そのための列のより適切なサイズを計算し、それをグリッドビューに指定する必要があります。アイデアは、すべてのデバイスの gridelement 間に常に同じスペースがある google play ストア アプリのようなものをレンダリングすることです (列は画面サイズに合わせて調整されます)。

編集:これが私が現在使用しているコードです...これは、グリッドビューを表示する方法を示しているRomain Guyの例から来ています。

    // This listener is used to get the final width of the GridView and then calculate the
    // number of columns and the width of each column. The width of each column is variable
    // as the GridView has stretchMode=columnWidth. The column width is used to set the height
    // of each view so we get nice square thumbnails.
    mGridView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (mAdapter.getNumColumns() == 0) {
                final int numColumns = (int) Math.floor((double) mGridView.getWidth() / (mImageThumbSize + mImageThumbSpacing));
                if (numColumns > 0) {
                    final int columnWidth = mGridView.getWidth() / numColumns - mImageThumbSpacing;
                    mAdapter.setNumColumns(numColumns);
                    mAdapter.setItemHeight(columnWidth);
                }
            }
        }
    });

mImageThumbSize と mImageThumbSpacing は寸法ファイルから取得されます。私が探しているのは、画面サイズに応じて最適な列数を自動的に計算する方法です。例: 低解像度の電話 2 列、電話 3 列、小型タブレット 4、タブレット 5、大型タブレット 6。主な問題は、電話がタブレットと同じグリッドビュー サイズを提供できるため、純粋な画面サイズに依存できないことです。計算。

4

2 に答える 2

2

画面の高さと高さを計算するには、次のコードを使用して、画面の特定の解像度も知ることができます。

Display display = getActivity().getWindowManager().getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);

int width = display.getWidth();
int height = display.getHeight();

switch (metrics.densityDpi) {
    case DisplayMetrics.DENSITY_LOW:

        break;
    case DisplayMetrics.DENSITY_MEDIUM:

        break;
    case DisplayMetrics.DENSITY_HIGH:

        break;
    case DisplayMetrics.DENSITY_XHIGH:

        break;
    case DisplayMetrics.DENSITY_XXHIGH:

        break;
}

ピクセル寸法をビューに設定するには、LayoutParams オブジェクトを使用する必要があります (多くの LayoutParams オブジェクトが存在します。変更するビューを含むビューの LayoutParams をユーザーが必要とします)。たとえば、RelativeLayout I にビューがある場合RelativeLayout の LayoutParams を使用する必要があります。

view.setLayoutParams(new android.widget.RelativeLayout.LayoutParams(width, width));
于 2013-06-14T16:19:08.120 に答える
1

240x320 から 800x1280 までの幅広い解像度があるため、Android アプリケーションでピクセルを寸法のように使用することは非常に悪い習慣です。dp または sp (スクリーン ポイント) を使用する方が適切です。

グリッドを思いどおりに作成するのは少し複雑です。私は1つを作成し、各解像度(ldpi、mdpi、hdpi、xhdpi、xxhdpi)のxml定義を作成し、それぞれの寸法を設定する必要がありました。基本的に、xmlはグリッド(1つのボックスのみ)を定義してから、グリッドビューを作成しますこれらすべてのグリッド定義のセットのように。

他にできることは、実行時に画面解像度 (幅 x 高さ) を計算し、それぞれのサイズをピクセル単位で設定することです。

たとえば、これは hd​​pi 解像度のグリッド行の xml 定義です。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relativeLayout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@color/fondoPantalla"
    android:padding="10sp" >

    <ImageView
        android:id="@+id/imagen"
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:src="@drawable/llamada" />

    <TextView
        android:id="@+id/texto"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/imagen"
        android:layout_centerHorizontal="true"
        android:text="@string/llamada"
        android:textColor="@color/letraTexto1"
        android:textSize="18sp" />

</RelativeLayout>

GridView のアクティビティでグリッド行を設定し、2 つの列を使用しました。

しかし、すべての解像度の寸法を定義することは非常に重要です。すべてのディメンションに共通するものは存在しません。ピクセルを使用しないようにしてください。解像度によっては過剰になる場合もあれば、そうでない場合もあります。

于 2013-06-11T18:05:27.577 に答える