1

我正在尝试创建一个完全适合任何屏幕尺寸的网格视图。当我阅读有关此主题的许多示例或 SO 答案时,我发现的唯一一件事是:将一些“dimensions.xml”文件放在每个值大小文件夹中,并让 gridview 调整列数和自动间距。问题是有时,间距太大,使结果非常难看。

我的问题是:如果我不想设置尺寸并想以像素精度管理 gridview 怎么办?任何例子都会受到欢迎。

为了清楚起见:例如,我想要 x 列,每列之间有 4 个像素的间隔,所以我需要为此计算更好的列大小并将其指定给 gridview。这个想法是呈现像谷歌游戏商店应用程序中的东西,每个设备上的网格元素之间总是有相同的空间(列调整为屏幕大小)。

编辑:这是我现在正在使用的代码......它来自 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。主要问题是手机可以提供与平板相同的 gridview 尺寸,所以我不能依赖纯屏幕尺寸计算。

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 我有一个视图需要使用RelativeLayout 的LayoutParams。

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

在 android 应用程序中像尺寸一样使用像素是一种非常糟糕的做法,因为您有从 240x320 到 800x1280 甚至更多的各种分辨率,对于某些分辨率,4pixels 看起来不错,但在其他分辨率下则不然。最好使用 dp 或 sp(屏幕点)。

以您想要的方式制作网格有点复杂。我做了一个,我必须为每个分辨率(ldpi、mdpi、hdpi、xhdpi、xxhdpi)创建一个 xml 定义,并为每个分辨率设置尺寸,基本上 xml 定义了一个网格(只有一个框)然后创建我的网格视图就像一组所有这些网格定义。

您可以做的其他事情是在运行时计算屏幕分辨率(宽度x高度)并为每个像素设置特定尺寸。

例如,这是我对 hdpi 分辨率的网格行的 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 回答