PDA

Ver la Versión Completa : [ CONSULTA ] Consulta sobre dp y pixel


androizado
16/12/15, 23:12:58
Buenas quería hacer una pregunta acerca de la mediciones que tenemos y las distintas densidades en Android, me lío bastante con los dp y píxeles.

En los layout siempre uso por ejemplo layout_width="30dp", con los textos si uso los sp, leí en varios sitios que era lo más recomendable para los textos, me gustaría saber vuestra opinión, pero alguna veces tengo que poner por programación los anchos o altos, ejemplo a un linearlayout, porque se me ha dado el caso y hago lo siguiente:

linearlayout.getLayoutParams().width = 20;

¿ese 20 que lo toma cómo pixel o como dp? No sé si debo de pasarlo por conversores que he visto, pxToDp o dpToPx, y si quisiera que fuese 20px tanto para densidades 1.0 como densidades 2.0. Por qué si veo que cambian en cuanto a tamaño lo cual es normal supongo pues son densidades distintas. Pero teniendo la siguiente miniatura, el cuadrado negro es 20px, pero al pasar el comando que indico en el gráfico en la densidad 2.0 no me pinta de rojo el cuadrado entero.

Espero que me echéis una mano, lo mismo me estoy rayando demasiado.

kriogeN
16/12/15, 23:48:32
Cuando asignas una medida por programación siempre es en píxeles. Si quieres que sea en DP tendrás que convertirlo con alguna de las múltiples funciones que hay por ahí como tu mismo has dicho.

Igual que si lees una medida después de que se haya ejecutado el onLayout, va siempre en píxeles.

En cuanto a lo de los textos en SP, yo siempre uso DP, salvo para muy contadas ocasiones. Primero hay que comprender la diferencia entre DP y SP.

DP son píxeles de densidad, que como ya sabes hace que si algo ocupa 1px en un ancho de 320px, ocupará 2px en un ancho de 640px.

SP son píxeles de escala, y la escala la marca el tamaño de la fuente del sistema (por eso se aplican a los textos, pero perfectamente podrías aplicarlo a una imagen que actúa como emoticono por ejemplo). Es decir, en este tipo de medida es la fuente del sistema la que determina el tamaño, un usuario que tenga configurado el tamaño Grande verá algo 1.5 veces más grande que alguien que lo tenga configurado como Normal.

Y vuelvo al principio, de cuando yo utilizo DP y cuando SP. Si el Layout tiene un formato tal que está hecho para que las etiquetas estén a una determinada distancia entre sí, y un botón ocupe un determinado tamaño, si usas SP y el usuario configura su móvil como Extra Grande, lo más probable es que el resultado no sea el esperado.

En cambio si usas DP siempre por defecto eso no te ocurrirá, pero si por ejemplo tienes un RecyclerView que contiene un Título y una imagen y al pulsarlo abre una Activity que simplemente contiene un texto multilínea muy largo, si en ese texto usas SP no te desconfigurará nada, y además será en el tamaño de letra que el usuario desea.

Espero que te sirva de ayuda.

androizado
17/12/15, 09:25:38
Muchisimas gracias por la respuesta kriogeN (http://www.htcmania.com/member.php?u=381391), la verdad que no conocía esa referencia de los sp. Me ha quedado bastante claro con la explicación que me has dado. Pero lo mismo sigo sin entender lo siguiente:

Si nos vamos al ejemplo que puse del cuadrado negro y en programación indico lo siguiente:

view.getLayoutParams().width = 20;

Me queda claro que es en píxeles ese 20, pero en un dispositivo de 1.0 me ocupa más espacio que en un dispositivo de 2.0. Pongo el ejemplo que comentaba anteriormente, quiero colorear una misma zona en distintas densidades, el cuadrado negro, si en densidad 1.0 pongo 20 de valor al width me rellena el toda la zona del cuadro. Pero en ese mismo si lo compilo para un dispositivo de 2.0 me rellena menos zona. La relación para rellenar la misma zona sería multiplicar ese valor 20 por la densidad del dispositivo?

kriogeN
17/12/15, 11:51:39
Tú mismo te estás respondiendo, en pixeles es 20, por lo tanto en móviles con más densidad ocupará menos tamaño relativo de la pantalla.

Ahora, supongamos que quieres hacer algo que ocupa la mitad de la pantalla. En Android la medida por defecto es que el ancho ocupa 320dp, aunque hay algunos modelos de HTC y otras marcas que usan 360dp. Pero supondremos el valor medio de 320dp.

Entonces, quieres que ocupe la mitad, es decir, 160dp. Si estableces:

view.getLayoutParams().width = 160;

La estás estableciendo EN PÍXELES. Por tanto si el móvil es MDPI ocupará la mitad, porque 1DP = 1PX. Pero si el móvil es XHDPI ocupará 1/4, porque 1DP = 2PX, siendo el ancho total en ese caso de 640px.

Para que ocupe la mitad SIEMPRE deberás hacer esto:

view.getLayoutParams().width = convertDpToPixel(160);

O en ese caso mejor aún, consultar cuanto es el ancho de la pantalla del móvil en píxeles y establecerlo a la mitad, también en píxeles.

De todas formas, ¿qué estás tratando de hacer? Porque yo en muy contadas ocasiones me he encontrado con casos en los que tenga que establecer una medida por programación, sólo cuando quiero que un item de un RecyclerView o ListView me ocupe la totalidad de la pantalla. El resto de los casos el 99% de las veces se resuelve estableciendo pesos.

Por último, te recuerdo que la conversión de DP a PX para establecer porcentajes de pantalla, sólo funciona EN HORIZONTAL. Ya que como te he dicho antes casi todos los móviles establecen un ancho de 320 DP, menos algunos que lo hacen en 360 DP. Mientras que la altura del móvil es libre, habrá algunos con más diferencia entre la anchura y la altura y otros con menos, eso no está regulado. Es como la diferencia entre el iPhone 4S y el 5, que tiene más píxeles de alto y los mismos de ancho.

androizado
17/12/15, 19:27:24
Si haciendo pruebas vi todo lo que me has comentado. Ahora me ha quedado más claro.

Es un juego de luces. Tengo una imagen que coloco en un ImageView. Está tiene transparencias. Las cuales por detrás del ImageView coloco un View para ir coloreándolas según un orden de colores y aleatoriamente. El problem que he tenido que ir colocando esos View por setX y setY. Y el tamaño ir dándoselo por programación.

Por eso comentaba lo de dar anchos por programación. Esto me vino porque las View las colocaba en el RelativeLayout y al compilarlas y probar en varios dispositivos, no se quedaban en su sitio. Por lo tanto decidí colocarlas con setX, setY y darles el tamaño adecuado.

La verdad no he podido mirar el por qué esas View no sé me quedaban el sitio. Pero intentaré investigarlo.

No obstante, muchisimas gracias porque he aprendido bastante con lo que me has comentado kriogeN.

kriogeN
17/12/15, 20:24:55
Puedes usar un RecyclerView con un GridLayoutManager.

O si el tamaño siempre va a ser fijo usar un LinearLayout Vertical en el que das pesos a LinearLayout horizontales, que a su vez contienen elementos que también contienen pesos.

Cada item ocupará un determinado porcentaje de la pantalla siempre, y los tamaños variarán según el tamaño de la pantalla.

androizado
18/12/15, 08:32:01
Efectivamente, lo hicé por porcentajes pero por programación pero en la opción que me has comentado ni me la había planteado. Gracias :)