Espacio en blanco al escalar imageview en gridview

Estoy buscando implementar una interfaz de usuario similar a las tarjetas de Google Play.

He creado un GridView y el fondo de la tarjeta como un archivo xml. Ahora, estoy buscando para ajustar imágenes en la tarjeta de modo que la sombra inferior es visible, pero el ancho de la imagen es el mismo que el ancho de la tarjeta. El problema es que hay un espacio en blanco alrededor de la imagen aunque establezca el GridView.LayoutParams proporcional al tamaño de la imagen. Intenté different scaleType pero ninguno funcionó. Además, una vez que obtengo el ancho de la imagen para ajustarse al ancho de la tarjeta, ¿cómo puedo asegurarme de que la sombra del fondo todavía está visible?

Introduzca aquí la descripción de la imagen

Mi clase de adaptador de imagen

package me.zamaaan.wallpaper; import android.content.Context; import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.ImageView; public class ImageAdapter extends BaseAdapter{ private Context mContext; // Keep all Images in array public Integer[] mThumbIds = { R.drawable.background1, R.drawable.background2, R.drawable.background3, R.drawable.background4, R.drawable.background1, R.drawable.background2, R.drawable.background1, R.drawable.background2, R.drawable.background3, R.drawable.background4, R.drawable.background1, R.drawable.background2, R.drawable.background3 }; // Constructor public ImageAdapter(Context c){ mContext = c; } @Override public int getCount() { // TODO Auto-generated method stub return mThumbIds.length; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return mThumbIds[position]; } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView = new ImageView(mContext); imageView.setImageResource(mThumbIds[position]); imageView.setScaleType(ImageView.ScaleType.FIT_XY); int width_dp = 109; double height_dp = width_dp/0.5625; int width_px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, width_dp, mContext.getResources().getDisplayMetrics()); int height_px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, (int)height_dp, mContext.getResources().getDisplayMetrics()); imageView.setLayoutParams(new GridView.LayoutParams(width_px, height_px)); imageView.setBackgroundResource(R.drawable.bg_card); return imageView; } } 

Bg_card.xml

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle" android:dither="true"> <corners android:radius="2dp"/> <solid android:color="#ccc" /> </shape> </item> <item android:bottom="2dp"> <shape android:shape="rectangle" android:dither="true"> <corners android:radius="2dp" /> <solid android:color="@android:color/white" /> <padding android:bottom="8dp" android:left="8dp" android:right="8dp" android:top="8dp" /> </shape> </item> </layer-list> 

Gridview.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/landscape" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:background="#eeeeee" android:gravity="center"> <GridView android:id="@+id/grid_view" android:layout_marginTop="16.50dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_width="fill_parent" android:layout_height="fill_parent" android:numColumns="3" android:paddingBottom="8dp" android:horizontalSpacing="11dp" android:verticalSpacing="7dp" android:gravity="center" android:stretchMode="columnWidth" > </GridView> </RelativeLayout> 

El tamaño real de las imágenes es

 720x1280px 

Sus imágenes no llenan la tarjeta porque en su fondo de la tarjeta usted tiene un relleno de 8dp en cualquier lado

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> ... <item android:bottom="2dp"> <shape android:shape="rectangle" android:dither="true"> <corners android:radius="2dp" /> <solid android:color="@android:color/white" /> <padding android:bottom="8dp" android:left="8dp" android:right="8dp" android:top="8dp" /> </shape> </item> </layer-list> 

Retire el relleno para que llene el ancho.

Si desea mantener la sombra también, sería mejor crear un 9-parche para su fondo para que pueda definir dónde se encuentra el contenido, algo así como:

Introduzca aquí la descripción de la imagen

Las líneas negras en la parte izquierda y superior representan las áreas escalables y las líneas en la parte inferior y derecha representan las áreas donde se encuentra el contenido (observe que el área de contenido en el lado derecho no cubre el área de sombra).

  • Android: mover los botones libremente en el editor de diseño gráfico de Eclipse
  • Android: capitalize no funciona
  • android xml El atributo de texto Textview no puede tomar '<' como valor
  • Accidente de transición de elemento compartido para dispositivos Lollipop
  • Android Flavors, ContentProviders, SyncAdapters y AccountManager
  • ¿Hay un equivalente a setColorFilter () en XML?
  • ¿Cómo hacer que una disposición lineal se pueda desplazar?
  • El diseño aparece diferente en la disposición gráfica y en el dispositivo real
  • Android: Edición de texto personalizado con XML
  • Archivo no válido: google-play-services_lib / build.xml en android
  • Ajuste EditText al tamaño de fuente
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.