He creado mi aplicación con la altura y el ancho dados en píxeles para un dispositivo Pantech cuya resolución es 480x800
.
Necesito convertir la altura y el ancho de un dispositivo G1.
Pensé que convertirlo en dp resolvería el problema y proporcionaría la misma solución para ambos dispositivos.
¿Hay alguna manera fácil de convertir píxeles a dp?
¿Alguna sugerencia?
android
pixel
resolution
dpi
Indhu
fuente
fuente
px
,dp
,sp
Fórmulas de conversiónRespuestas:
fuente
applyDimension
? ¿Puedo hacergetResource().getDisplayMetrics()
algo o hay algo más?Context
uso de objetosResources.getSystem().getDisplayMetrics()
fuente
Resource.getSystem()
(el énfasis es mío): "Devuelve un objeto de recursos compartidos global que proporciona acceso solo a recursos del sistema (sin recursos de la aplicación) y no está configurado para la pantalla actual ( no puede usar unidades de dimensión , no cambia basado en la orientación, etc.) ".DisplayMetrics.DENSITY_DEFAULT
en lugar de160f
developer.android.com/reference/android/util/...Preferiblemente poner en una clase Util.java
fuente
density
es igual.75
encendidoldpi
(120
ppp)1.0
encendidomdpi
(160
ppp; línea de base)1.5
encendidohdpi
(240
ppp)2.0
encendidoxhdpi
(320
ppp)3.0
encendidoxxhdpi
(480
ppp)4.0
encendidoxxxhdpi
(640
ppp)Use este convertidor en línea para jugar con los valores de dpi.
EDITAR: Parece que no hay una relación 1: 1 entre el
dpi
cubo ydensity
. Parece que elNexus 5X
serxxhdpi
tiene undensity
valor de2.625
(en lugar de3
). Véalo usted mismo en las métricas del dispositivo .fuente
Puedes usar esto ... sin contexto
Como mencionó @Stan ... el uso de este enfoque puede causar problemas si el sistema cambia la densidad. ¡Entonces sé consciente de eso!
Personalmente estoy usando Context para hacer eso. Es solo otro enfoque con el que quería compartirlo
fuente
Si puede usar las dimensiones XML, ¡es muy simple!
En su
res/values/dimens.xml
:Luego en tu Java:
fuente
De acuerdo con la Guía de desarrollo de Android:
Pero a menudo querrá realizar esto al revés cuando reciba un diseño que se indica en píxeles. Entonces:
Si está en un dispositivo de 240 ppp, esta relación es 1.5 (como se indicó anteriormente), por lo que esto significa que un icono de 60 píxeles equivale a 40 ppp en la aplicación.
fuente
Sin
Context
métodos estáticos elegantes:fuente
Resources.getSystem()
javadoc dice "Devuelve un objeto de recursos compartidos global que proporciona acceso solo a recursos del sistema (sin recursos de aplicación), y no está configurado para la pantalla actual (no puede usar unidades de dimensión, no cambia según la orientación, etc.)". Esto prácticamente dice que no deberías estar haciendo esto, incluso si de alguna manera funciona.por
DP to Pixel
Crea un valor en
dimens.xml
Obtenga ese valor
pixel
como:fuente
Por lo tanto, puede usar el siguiente formulador para calcular la cantidad correcta de píxeles de una dimensión especificada en dp
fuente
convertToDp
.Para cualquiera que use Kotlin:
Uso:
fuente
Hay una utilidad predeterminada en el SDK de Android: http://developer.android.com/reference/android/util/TypedValue.html
fuente
resultPix
debe ser de tipo int.int resultPix = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,1,getResources().getDisplayMetrics())
usando kotlin-extension lo hace mejor
ACTUALIZAR:
Debido a que
displayMetrics
es parte de los recursos globales compartidos , podemos usarResources.getSystem()
fuente
Esto debería darle la conversión dp a píxeles:
Esto debería darle los píxeles de conversión a dp:
fuente
Kotlin
Java
fuente
Probablemente la mejor manera si tiene la dimensión dentro de los valores / dimen es obtener la dimensión directamente del método getDimension (), le devolverá la dimensión ya convertida en valor de píxel.
Solo para explicar mejor esto,
devolverá la dimensión ya convertida a píxel COMO UN FLOTADOR.
devolverá lo mismo pero truncado a int, así que COMO UN INTEGER.
Ver referencia de Android
fuente
donde recurso es context.getResources ().
fuente
Me gusta esto:
depende del contexto, valor de retorno de flotación, método estático
de: https://github.com/Trinea/android-common/blob/master/src/cn/trinea/android/common/util/ScreenUtils.java#L15
fuente
Enfoque más elegante usando la función de extensión de Kotlin
Uso:
fuente
function name
", que me doy cuenta de que está al revés en este caso. Para aclarar la intención de cada función, los nombres de las funciones podrían actualizarse para leer dpToPx y pxToDp, respectivamente.fuente
En caso de que desarrolle una aplicación crítica de rendimiento, considere la siguiente clase optimizada:
fuente
para convertir píxeles a dp use TypedValue .
Como se menciona en la documentación: Contenedor para un valor de datos con tipo dinámico.
y use el método applyDimension :
que convierte un valor de datos complejos desempaquetado que contiene una dimensión a su valor final de coma flotante como el siguiente:
Espero que ayude .
fuente
Así es como funciona para mí:
Puedes hacer lo mismo para el ancho.
fuente
Muchas soluciones excelentes arriba. Sin embargo, la mejor solución que encontré es el diseño de Google:
https://design.google.com/devices/
fuente
Debe usar dp tal como lo haría con los píxeles. Eso es todo lo que son; Mostrar píxeles independientes. Use los mismos números que usaría en una pantalla de densidad media, y el tamaño será mágicamente correcto en una pantalla de alta densidad.
Sin embargo, parece que lo que necesita es la opción fill_parent en su diseño de diseño. Use fill_parent cuando desee que su vista o control se expanda a todo el tamaño restante en el contenedor principal.
fuente
PX
yDP
son diferentes pero similares.DP
es la resolución cuando solo se factoriza el tamaño físico de la pantalla. Cuando lo useDP
, escalará su diseño a otras pantallas de tamaño similar con diferentespixel
densidades.Ocasionalmente
pixels
, sin embargo, realmente desea , y cuando trata con dimensiones en código, siempre está tratando con realpixels
, a menos que las convierta.Entonces, en un dispositivo Android,
hdpi
pantalla de tamaño normal ,800x480 is 533x320
enDP
(creo). Para convertirDP
enpixels /1.5
, para volver a convertir*1.5
. Esto es solo para el tamaño de una pantalla ydpi
cambiaría según el diseño. Sinpixels
embargo, nuestros artistas me dan y me conviertoDP
con la1.5
ecuación anterior .fuente
Si desea valores enteros , use Math.round () redondeará el flotante al entero más cercano.
fuente
La mejor respuesta proviene del propio marco de Android: solo use esta igualdad ...
(convierte dp a px)
fuente
Esto funciona para mí (C #):
fuente
Kotlin
Java
fuente