多个设备上的Gridview和列大小

时间:2013-06-11 17:00:34

标签: android gridview size screen

我试图创建一个完全适合屏幕尺寸的网格视图。 当我阅读关于这个主题的许多例子或SO答案时,我发现的唯一的事情是:放一些" dimensions.xml"每个values-size文件夹中的文件,让gridview调整列数和自动间距。问题是,有时,间距太大会使结果变得非常丑陋。

我的问题是:如果我不想放大小并希望以像素精度管理网格视图怎么办?任何例子都会受到欢迎。

为了清楚起见:例如,我想要x列,每列之间有4个像素的间隔,所以我需要计算更好的列大小并将其指定给gridview。我们的想法是在google play store应用程序中呈现一些内容,即每个设备上的gridelement之间总是有相同的空间(列调整为屏幕大小)。

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

2 个答案:

答案 0 :(得分:2)

用于计算屏幕的with和height可以使用下一个代码,也可以知道屏幕上的特定分辨率。

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对象,您需要用户包含您正在修改的视图的View的LayoutParams),例如,如果我有一个视图一个RelativeLayout我需要使用RelativeLayout的LayoutParams。

view.setLayoutParams(new android.widget.RelativeLayout.LayoutParams(width, width));

答案 1 :(得分:1)

在Android应用程序中使用像维度这样的像素是一个非常糟糕的做法,因为你有240x320到800x1280以及更多的分辨率,对于某些分辨率,4像素看起来很棒,但在其他分辨率下却没有。如果你使用dp或sp(屏幕点)会更好。

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

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

例如,这是我对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列。

但确定所有分辨率的维度非常重要。所有维度的通用名称都不存在。尽量不要使用像素,因为在某些分辨率下它可能过多而在其他分辨率下可能不会。