2011-05-22 15 views
7

Estoy haciendo un widget de aplicación para Android, que debido a que está compuesto de elementos personalizados como gráficos, debe representarse como un mapa de bits.Widget de aplicación de Android procesada a medida

Sin embargo, me he encontrado con algunos inconvenientes en el proceso.

1) ¿Hay alguna manera de encontrar el espacio máximo disponible para un widget de aplicación? (O: ¿Es posible calcular las dimensiones correctamente para el espacio mínimo disponible en casos WVGA (o anchos similares)?

No sé cómo calcular el espacio máximo disponible para un widget de aplicación. aplicación widget es posible fill_parent, y se usará todo el espacio. Sin embargo, cuando se renderiza el widget como un mapa de bits, y para evitar el estiramiento, se deben calcular las dimensiones correctas. La documentación describe cómo calcular las dimensiones mínimas, pero para casos como WVGA, habrá espacio no utilizado en modo horizontal -. causando el widget para buscar más corto que otros widgets que se extienden de forma natural

float density = getResources().getDisplayMetrics().density; 
int cx = ((int)Math.ceil(appWidgetInfo.minWidth/density) + 2)/74; 
int cy = ((int)Math.ceil(appWidgetInfo.minHeight/density) + 2)/74; 
int portraitWidth = (int)Math.round((80.0f * cx - 2.0f) * density); 
int portraitHeight = (int)Math.round((100.0f * cy - 2.0f) * density); 
int landscapeWidth = (int)Math.round((106.0f * cx - 2.0f) * density); 
int landscapeHeight = (int)Math.round((74.0f * cy - 2.0f) * density); 

Calcula ting cx y cy da la cantidad de celdas horizontales y verticales. Restando - 2 del dpi calculado (por ejemplo, 74 * cy - 2) es para evitar casos donde el número resultante de píxeles se redondea hacia abajo. (Por ejemplo, en modo horizontal en Nexus One, la altura es 110, no 111 (74 * 1.5).

2) Al asignar un mapa de bits a un ImageView que se usa como parte de las RemoteViews para ver la imagen, hay son 2 métodos:

2.1) Al usar setImageViewUri, y guardar el mapa de bits en un archivo PNG. La imagen se sirvió a continuación utilizando una implementación abrirArchivo() en un ContentProvider:

@Override 
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException 
    // Code to set up imageFileName 
    File file = new File(getContext().getCacheDir(), imageFileName); 
    return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY); 
} 

Esto funciona, y es el enfoque que actualmente estoy usando. Sin embargo, si configuro el scaleType de ImageView en "centro", que según la documentación se supone que "Centre la imagen en la vista, pero no realice escalas", la imagen se escalará incorrectamente. Establecer la densidad del mapa de bits en DENSITY_NONE o getResources(). GetDisplayMetrics(). DensityDpi no hace ninguna diferencia al guardar el mapa de bits en PNG, parece que se ignora cuando el archivo es cargado por ImageView. El resultado es que la imagen se reduce, debido a algún problema de dpi. Esto parece describir el caso:

http://code.google.com/p/android/issues/detail?id=6957&can=1&q=widget%20size&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars

Debido a que no es posible utilizar ScaleType: central, la única manera que he encontrado para el trabajo es establecer la layout_width y layout_height del ImageView estáticamente a una determinada número de dpis, luego renderizando el mapa de bits al mismo dpi. Esto requiere el uso de scaleType: fitXY. Este enfoque funciona, pero es una configuración muy estática, y no funcionará para widgets de aplicaciones de tamaño variable de 3.1 (todavía no he probado esto, pero a menos que se llame a onUpdate() en cada cambio de tamaño, esto es cierto).

¿Hay alguna manera de cargar una imagen en una ImageView sin escala, o es imposible debido a un error en el marco?

2.1) Al usar setImageViewBitmap directamente. Al usar este método con la configuración Bitmap.DENSITY_NONE en el mapa de bits, la imagen se puede mostrar sin escalar correctamente. El problema con este enfoque es que hay una limitación a cómo las imágenes grandes se pueden configurar a través del mecanismo IPC:

http://groups.google.com/group/android-developers/browse_thread/thread/e8d84920b999291f/d12eb1d0eaca93ac#01d5c89e5e7b4060

(no se permiten más enlaces) http://groups.google.com/group/android-developers/browse_thread/thread/b11550601e6b1dd3 # 4bef4fa8908f7e6a

Estoy intentando hacer algo al respecto, dividiendo el widget en una matriz de imágenes que se puede establecer en bloques de 100x100 píxeles. Esto permitió que los widgets más grandes funcionaran, pero terminó siendo muy pesado y falló en widgets grandes (4x4).

Lo siento por una publicación muy larga. Intenté explicar algunos de los diferentes problemas al intentar utilizar un widget de aplicación procesada en mapa de bits. Si alguien ha intentado lo mismo y ha encontrado más soluciones a estos problemas, o tiene algún comentario útil, será muy apreciado.

Respuesta

0

Un enfoque que funcionó para nosotros en una situación similar fue generar nuestro gráfico como un png de 9 parches, con la parte del gráfico real como el rectángulo central escalable y los iconos de texto e indicación del título (que no queríamos todo estirado fuera de forma) y efectos de borde, colocados en los rectángulos externos de la imagen.

Cuestiones relacionadas