2013-06-11 4 views
1

我試圖創建一個完美適合屏幕大小的gridview。 當我讀到很多關於這個主題的例子或SO答案時,我發現的唯一的東西是:在每個values-size文件夾中放入一些「dimensions.xml」文件,並讓gridview調整列數和自動間距。問題是,有時候,間距太大,結果真的很難看。多個設備上的Gridview和列大小

我的問題是:如果我不想放一個大小,想要像素精度管理gridview呢?任何例子都會受到歡迎。

只是要清楚:例如,我希望每列之間有4個像素的x列,所以我需要計算更好的列大小並將其指定給gridview。這個想法是在谷歌商店應用程序中呈現的東西,在每個設備上的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.主要問題是手機可以提供與平板電腦相同的gridview尺寸,所以我不能依靠純屏幕尺寸計算。

回答

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列。

但是爲所有分辨率定義尺寸真的很重要。通用於所有維度的東西不存在。儘量不要使用像素,因爲在某些分辨率下它可能過度,而在其他分辨率下則可能不會。

+0

這很有趣,但它並沒有真正回答我的問題。 – Gomoku7

+0

它不可能只使用一個像素精度值的所有應用程序,在android中你有很多的決議和尺寸。也許可以用這個代碼prub來獲得你的像素精度值。我發佈了一張表格來獲得scree的高度和高度。 –

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));