2012-06-20 27 views
234

Me gustaría cargar el valor tal como está. Tengo dos archivos dimension.xml, uno en /res/values/dimension.xml y el otro en /res/values-sw360dp/dimension.xml.Cargar valor de dimensión desde res/values ​​/ dimension.xml desde el código fuente

partir del código fuente que me gustaría hacer algo como

getResources().getDimension(R.dimen.tutorial_cross_marginTop); 

Esto funciona, pero el valor de recibo se multiplica por el factor de densidad de pantalla (1,5 por IPAP, 2.0 para xhdpi, etc).

También he tratado de hacer

getResources().getString(R.dimen.tutorial_cross_marginTop); 

Esto funcionaría en principio, pero me sale una cadena que termina en "caída" ...

+1

Me pregunto si es error en Android como Recursos tiene método 'getDimensionPixelSize (int id)' que indica exactamente que regresa en píxeles, por lo que 'getDimension (int id)' debe volver en DP (dependencia unidades independientes), que estaría listo para su uso, por ejemplo con Ver 'setPadding' –

Respuesta

585

En mi dimens.xml tengo

<dimen name="test">48dp</dimen> 

En el código Si hago

int valueInPixels = (int) getResources().getDimension(R.dimen.test) 

esto devolverá 72, que como el estado docs se multiplica por la densidad de teléfono actual (48DP x 1,5 en mi caso)

exactamente como estado docs:

recuperar una dimensión para un ID de recurso en particular. Las conversiones de unidad se basan en las DisplayMetrics actuales asociadas a los recursos.

así que si quieres valor dp exacta al igual que en XML simplemente dividirlo con la densidad DisplayMetrics

int dp = (int) (getResources().getDimension(R.dimen.test)/getResources().getDisplayMetrics().density) 

dp 48 será ahora

+1

Creo que la documentación es particularmente incierta aquí. "Las conversiones de unidades se basan en las DisplayMetrics actuales asociadas a los recursos". cuando todo lo que quieren decir es que se convierten en píxeles. – Trilarion

+0

Si esencialmente va a descartar el multiplicador de métricas de pantalla, también puede definir su dimensión en px. 48px. getDimension (R.dimen.test) devolverá 48. –

17
Context.getResources().getDimension(int id); 
1
This works but the value I get is multiplied times the screen density factor 
    (1.5 for hdpi, 2.0 for xhdpi, etc). 

Creo que es bueno para obtener el valor según la resolución, pero si no desea hacerlo, dése esto en px .......

píxel independiente de la densidad (dp)

Unidad de píxeles virtuales que debe usar al definir el diseño de la interfaz de usuario, para expresar las dimensiones del diseño o la posición de una manera independiente de la densidad. El píxel independiente de la densidad es equivalente a un píxel físico en una pantalla de 160 ppp, que es la densidad base asumida por el sistema para una pantalla de densidad "media". En tiempo de ejecución, el sistema maneja de manera transparente cualquier escala de las unidades dp, según sea necesario, based on the actual density of the screen in use. The conversion of dp units to screen pixels is simple: px = dp * (dpi/160). For example, on a 240 dpi screen, 1 dp equals 1.5 physical pixels.. Siempre debe usar unidades dp cuando defina la IU de su aplicación para garantizar una visualización adecuada de su UI en pantallas con densidades diferentes.

creo que es bueno para cambiar el valor de acuerdo con la resolución, pero si usted no quiere hacer esto da esto en px .......

refieren este link

según esta

dp

Píxeles independientes de la densidad: unidad abstracta que se basa en la densidad física de la pantalla. Estas unidades son relativas a una pantalla de 160 dpi (puntos por pulgada), en la cual 1dp es aproximadamente igual a 1px. When running on a higher density screen, the number of pixels used to draw 1dp is scaled up by a factor appropriate for the screen's dpi. Likewise, when on a lower density screen, the number of pixels used for 1dp is scaled down. La relación de dp-a-píxel cambiará con la densidad de la pantalla, pero no necesariamente en proporción directa. El uso de unidades dp (en lugar de unidades px) es una solución simple para hacer que las dimensiones de la vista en su diseño cambien de tamaño correctamente para diferentes densidades de pantalla. En otras palabras, proporciona consistencia para los tamaños del mundo real de los elementos de tu UI en diferentes dispositivos.

px

Píxeles - Corresponde a los píxeles reales en la pantalla. No se recomienda esta unidad de medida porque la representación real puede variar según los dispositivos; cada dispositivo puede tener un número diferente de píxeles por pulgada y puede tener más o menos píxeles totales disponibles en la pantalla.

21

La clase Resource también tiene un método getDimensionPixelSize() que creo que se ajustará a sus necesidades.

+21

¡Esto está mal! la conversión de medidas también ocurre en 'getDimensionPixelSize()' si puede hacer referencia a los documentos, indica claramente ** Devuelve ** 'Valor de dimensión del recurso multiplicado por la métrica apropiada y truncado a píxeles enteros. –

+0

Esto es incorrecto. La conversión de métricas también se realiza con este método. –

-1

Puede utilizar uno de los métodos, por ejemplo, su segundo y añadir estas líneas a los resultados:

int stringLength = getResources().getString(R.dimen.tutorial_cross_marginTop).length(); 
string stringDimensions = getResources().getString(R.dimen.tutorial_cross_marginTop); 
int dimension = Integer.parseInt(stringDimensions.substring(stringLength-3, stringLength-1)); 

Espero que ayude :)

4

Para aquellos que sólo necesitan para ahorrar algo de int valor de los recursos, puede hacer lo siguiente.

integers.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <integer name="default_value">100</integer> 
</resources> 

Código

int defaultValue = getResources().getInteger(R.integer.default_value); 
+1

Gracias por esto, era más de lo que estaba buscando, aunque tal vez no para otros, pero esta solución proporcionada en realidad me brindó una idea de otras áreas de mi código – JamisonMan111

0

Puede utilizar getDimensionPixelOffset() en lugar de getDimension, por lo que no tiene que echar a int.

int valueInPixels = getResources().getDimensionPixelOffset(R.dimen.test) 
Cuestiones relacionadas