Nexus 7 y Kindle Fire HD, piensan diferente

Estoy desarrollando una aplicación para tableta de 7 pulgadas Kindle Fire HD y Nexus 7. Estas dos aplicaciones tienen el mismo tamaño y la misma resolución de pantalla. Sin embargo, ejecuto mi aplicación, es muy diferente. ¿Por qué?

parece que esto es porque el nexo 7 se detecta como TVDPI, y el Kindle Fire HD es HDPI. ¿Cómo tener una misma renderización basada en un modelo 1280 * 800?

Gracias

Bueno, parece que ya has descubierto por qué los dos tienen diferencias, es porque informan diferentes factores de escala de densidad:

  • Nexus 7: TVDPI: Factor de escala = 1,333
  • Kindle Fire HD: HDPI: Factor de escala = 1.5

Entonces, ¿por qué se reportan de manera diferente cuando técnicamente tienen el mismo tamaño físico y la misma resolución?

El problema CORE realmente existe porque un dispositivo es un dispositivo de Google Play (Nexus) y el otro no (Kindle). Todos los dispositivos Android que tienen Google Play (y otras aplicaciones de Google) sólo pueden hacerlo pasando algo llamado el Compatibility Test Suite (CTS), que verifica que los ajustes como éste se ajustan a los estándares que han presentado. Las propias normas están documentadas en un Documento de Definición de Compatibilidad (CDD) para cada versión. Aquí hay un enlace al CDD para Android 4.0 (la sección 7.1 trata del tamaño y la densidad de la pantalla). El CDD le dice a un fabricante de dispositivos que debe informar el factor de escala que es numéricamente más cercano al DPI real de la pantalla, que es de hecho TVDPI en este caso.

Los dispositivos de Amazon no utilizan ninguna aplicación de Google, incluida Google Play. Si bien puede ser en su mejor interés para seguir los mismos estándares, no están obligados por ellos, y las a menudo no se siguen. TVDPI tipo de snuck en todo el mundo cuando se presentó en el Nexus 7, pero Amazon habría sabido acerca de si se hace referencia a la CDD durante el diseño.

¿Cómo esto los hace comportarse diferentemente?

Las diferencias no están en su selección de diseño. Obviamente, desde sus capturas de pantalla ambos dispositivos están recogiendo el diseño adecuado como usted espera que ellos. Cambiar el valor de sw en un directorio de diseño sólo afecta a los dispositivos que seleccionan ese diseño … no cambia nada acerca de cómo se van a escalar las cosas. No se moleste en intentar colocar los diseños en directorios específicos de densidad … los diseños se supone que son flexibles.

En su lugar, el problema reside en cualquier cálculo de dimensión o tamaño realizado en unidades de píxeles independientes de la densidad (es decir, dip o dp), como tamaños de texto, cualquier tamaño de vista fijo que haya creado y tamaños que puedan dibujarse.

Debido a que estos dos dispositivos han optado por escalar los activos de forma diferente, cualquier recurso extraíble que use o cualquier valor que defina en "dp" resultará en un pequeño cambio. Permítanme darles dos ejemplos:

Se define el tamaño de texto para que un TextView sea 16dp . En el Nexus 7, esto dibujará el texto en 21px. El Kindle Fire HD dibujará el mismo texto en 24px. La diferencia es pequeña … pero existe.

Lo mismo es cierto para las imágenes dibujables. Si sólo definió una imagen en drawable-mdpi en 48×48 y la misma imagen en drawable-hdpi en 72×72, el Kindle tiene una imagen de 72px para usar directamente, y el Nexus creará una imagen de escala de 64px, por lo que hay una diferencia de 8 píxeles entre los dos activos.

¿Qué puedo hacer para que los dos se parezcan más?

En la mayoría de los casos, yo diría que no. Normalmente, la escala realizada no afecta en gran medida al resultado de la aplicación, a menos que las restricciones de la disposición se configuren con demasiados tamaños codificados.

Sin embargo, en general, si hay partes de su interfaz de usuario que necesita cambiar específicamente para este propósito, la solución es definir recursos específicos y dimensiones para el caso -tvdpi donde se sienten necesarios (de nuevo, no recomendaría escalar TODO en su aplicación para cumplir con este caso).

Para cosas como tamaños de texto o de vista, significa que puede que desee un archivo values-tvdpi/dimensions.xml y un archivo de values/dimensions.xml predeterminado. Utilizando el ejemplo anterior, puede definir el tamaño de texto predeterminado como 16dp, pero en la ubicación -tvdpi , defina la misma dimensión que 18dp. Esto hará que ambos dispositivos escalen el texto final hasta 24px. En su código, donde se utiliza la dimensión real, haga referencia a ella como @dimen/myTextSize lugar de 16dp directamente.

Para los elementos extraíbles, añada un directorio drawable-tvdpi y drawable-tvdpi esos activos para que coincidan con la forma en que piensa que deberían dibujar en dispositivos como el Nexus 7. De nuevo con nuestro ejemplo anterior, copie el mismo archivo de imagen de la carpeta drawable-hdpi drawable-tvdpi para que ambos dispositivos dibujen la misma imagen a 72 píxeles.

Para evitar copiar el mismo activo en varios lugares, también puede hacerlo con aliasing. Poner la imagen misma en drawable/ con un nombre especial, y usando values-tvdpi/drawables.xml y values-hdpi/drawables.xml para referenciar el activo individual en dos lugares. Para obtener más información sobre aliasing, consulte esta documentación . Los ejemplos son para diseños, pero el mismo paradigma funciona para drawables (o cualquier recurso) cambiando a type="drawable" .

Debido a que el Nexus7 es un dispositivo tvdpi que utiliza los activos de layout-sw600dp (basado en cálculos a 213dpi), el FireHD es un dispositivo HDPI y termina usando los recursos de layout-sw533dp (cálculos basados ​​en 240dpi)

Tal vez deberías usar layout-tvdpi y layout-hdpi?

  • Android 4.2.2 adb no puede encontrar dispositivos
  • Asus Nexus 7 no reconocido por las herramientas de desarrollo de Android vía adb
  • Android - vídeo de la cámara verticalmente volteado
  • Nexus 7, Android 4.4 y imagen png
  • Mi aplicación no es compatible con Nexus 7 en Google Play Store
  • Android android.provider.MediaStore.ACTION_VIDEO_CAPTURE devuelve null onActivityResult con nexus 7
  • Cómo conectar nexus 7 a ADT en vmware Windows invitado
  • Android - Conexión a un dispositivo con adb over wifi
  • Abra la cámara en la tableta Nexus 7
  • Nexus 7 no es recogido por adb (cuando lo conecto a la computadora portátil a través de usb)
  • Depuración USB no funciona, adb ignora Nexus 7
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.