tamaño - soporte para multiples pantallas android studio
Android en múltiples tamaños de pantalla con la misma densidad. (6)
Entonces, si tengo una imagen de 300px de ancho en la carpeta mdpi, ¿cómo se verá el mismo tamaño en los 3 tamaños de pantalla diferentes (principalmente 320x480 en comparación con los otros 2)?
La apariencia física de la imagen depende de la densidad de la pantalla, no del tamaño de la pantalla. Su carpeta -mdpi
no está vinculada al tamaño de la pantalla; está vinculada a la densidad de la pantalla.
Estoy confundido respecto a las densidades. Veo que con una densidad media, la resolución de la pantalla podría ser 320x480, 480x800 o 480x854. Entonces, si tengo una imagen de 300px de ancho en la carpeta mdpi, ¿cómo se verá el mismo tamaño en los 3 tamaños de pantalla diferentes (principalmente 320x480 en comparación con los otros 2)? Y por el mismo tamaño, me refiero a que la escala sea mayor o menor según el tamaño de la pantalla. Gracias.
¿Podría por favor confirmar la fórmula para calcular la densidad de la pantalla?
Como he leído, la siguiente es la fórmula:
Densidad = SQRT (wp ^ 2 + hp ^ 2) / tamaño de la pantalla
wp -> ancho de la pantalla (en px) hp -> altura del tamaño de la pantalla (en px) -> tamaño físico de la pantalla (pulgadas diagonales)
tamaño de pantalla (320x480) = SQRT (102400 + 230400) / 160 = 3.6 pulgadas
tamaño de pantalla (480x800) = SQRT (640000 + 230400) / 160 = 5.8 pulgadas
tamaño de pantalla (480x854) = SQRT (729316 + 230400) / 160 = 6.12 pulgadas
Por lo tanto, los diseños (pantallas UI) están controlados por tamaños de pantalla (pequeño: <3 ", normal <4", grande> 5 ") y los recursos dibujables (imágenes) están controlados por densidades de pantalla.
Y, el tamaño de la imagen (en píxeles) no cambia si la densidad de las pantallas (320x480, 480x800 o 480x854) es la misma.
¿Podría por favor confirmar?
Gracias ram
En realidad, el código para calcular el tamaño de la pantalla física para dispositivos es el siguiente:
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
double x = Math.pow(dm.widthPixels/dm.xdpi,2);
double y = Math.pow(dm.heightPixels/dm.ydpi,2);
double screenInches = Math.sqrt(x+y);
Hay tres conceptos distintos pero vinculados para entender aquí: densidad de la pantalla (píxeles por pulgada / centímetro, o comúnmente conocida como DPI de puntos por pulgada en impresoras), tamaño de la pantalla física (en pulgadas o centímetros) y número de píxeles (también conocido como resolución, en píxeles).
Estos términos no son intercambiables, y debe comprender cómo se relacionan entre sí para no confundirse con el problema. En general, puede ignorar el tamaño de la pantalla física ya que eso ya se tiene en cuenta en la densidad. Por ejemplo, una pantalla de 3 pulgadas de ancho y 300 píxeles de ancho tendrá un DPI de 100. Además, las pantallas de los teléfonos tienden a tener aproximadamente el mismo tamaño físico, incluso si la cantidad de píxeles es muy diferente.
Entonces, consideremos la pantalla de un G1 o Hero que tiene una resolución de 480x320 y una densidad de aproximadamente 160 ppp. Una imagen de 300 píxeles de ancho tendrá 1.875 pulgadas de ancho. Esto se calcula por tamaño de píxel (300) / densidad (160). Ahora, si compara esto con la pantalla del Nexus One, Droid o similar, estos modelos tienen una pantalla de mayor resolución de aproximadamente 800x480 con una alta densidad de aproximadamente 240 ppp. Si muestra la misma imagen de 300px de ancho, ahora solo se mostrará físicamente a una pulgada y un cuarto de pulgada de ancho. En otras palabras, será mucho más pequeño. Esto puede ser un problema porque si la imagen contiene texto, es posible que el texto ya no sea legible.
Se puede indicar a Android que escala las imágenes automáticamente para que se ajusten a estas diferentes pantallas, de modo que aún parezca del mismo tamaño. Esto se hace estableciendo tamaños en píxeles independientes de densidad. Si algo tiene 100dp de ancho, tendrá un ancho de 100px en una pantalla de densidad media. En una pantalla de alta densidad, tendrá un ancho de 150 px, pero ambos se verán casi del mismo tamaño en la pantalla real. Sin embargo, si haces esto, tu imagen puede volverse un poco borrosa. Es lo mismo que cuando se acerca demasiado a una foto en un programa de visualización de imágenes; los bordes se vuelven borrosos ya que los "estira" mientras haces zoom.
La forma de resolver esto es usar las carpetas mdpi, hdpi, etc. Le está dando a Android una imagen que ya ha sido escalada, para que no tenga que hacerlo por sí misma. Obviamente, si solo estiras la imagen en Photoshop, entonces no se verá mejor. Pero normalmente uno está redimensionando imágenes muy grandes hacia abajo para que se ajusten a la pantalla del móvil. En ese caso, simplemente redimensione tres veces diferentes, cada una en una resolución diferente.
Entonces, para responder finalmente a su pregunta específica: si tiene una imagen colocada en su carpeta mdpi, será exactamente del mismo tamaño, independientemente de la resolución de la pantalla, siempre y cuando todas tengan la misma densidad. Lo que cambiará es la cantidad de espacio que los rodea, por ejemplo, una imagen de 320x320px de ancho llenaría la mayor parte de una pantalla de 320x480, pero solo alrededor de un tercio de una pantalla de 480x800. Sin embargo, como se señaló anteriormente, generalmente los teléfonos de mayor resolución también tienen una pantalla más densa. En ese caso, Android no buscará la imagen en su carpeta mdpi; irá a la carpeta hdpi, y si no la encuentra allí, tomará la carpeta "dibujable" predeterminada. Luego, si ha usado DP, se escalará automáticamente, o si ha usado PX, lo dejará como está, y se verá más pequeño.
¡Ahí! Una respuesta muy larga para ti. Espero que tenga sentido.
Para completar, también marque estas opciones para controlar el diseño:
Calificadores de directorio:
Size: small, normal, large Density: ldpi, mdpi, hdpi, nodpi(no auto-scale) Aspect ratio: long, notlong Orientation: land Uso:
res/layout/my_layout.xml
res/layout-small/my_layout.xml
res/layout-large/my_layout.xml
res/layout-large-long/my_layout.xml
res/layout-large-land/my_layout.xml
res/drawable-ldpi/my_icon.png
res/drawable-mdpi/dpi/my_icon.png
res/drawable-hdpi/my_icon.png
res/drawable-nodpi/composite.xml
Restricción de su aplicación a tamaños de pantalla específicos (a través de AndroidManifest):
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
...
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:anyDensity="true" />
...
</manifest>
Y para tweeking a nivel de código:
float scale = getContext().getResources().getDisplayMetrics().density;
Y no te olvides:
dpi = 160; //At 160dpi
pixels = dips * (density / dpi)
Todo está en este documento: developer.android.com : Compatibilidad con múltiples pantallas
Para esto son los píxeles independientes del dispositivo (DIP). En lugar de 320px
escribe 320dip
.
http://developer.android.com/guide/practices/screens_support.html