2012-03-26 18 views
91

Lo sé, ya se discutió 1000 veces, pero no puedo ajustar el tamaño del texto para diferentes tamaños de pantalla. Trato de usar 'sp' como unidades de tamaño en mi estilo personalizado:Tamaño del texto y diferentes tamaños de pantalla de Android

<style name="CustumButtonStyle" parent="@android:style/Widget.Button"> 
    ... 
    <item name="android:textSize">30sp</item> 
    ... 
</style> 

En 2.7 QVGA se ve bien:

2.7QVGA 30sp http://u.pikucha.ru/i8CRP/1.jpeg

Pero en WSVGA de 7 pulgadas que tiene este aspecto:

7in WSVGA 30sp http://u.pikucha.ru/i8CRQ/2.jpeg

He intentado usar tanto 'sp' como 'dp' con el mismo resultado.

¿Podría explicarnos cómo hacer que estos botones se vean iguales en cualquier pantalla?

El estilo de botón personalizado completo

<style name="CustumButtonStyle" parent="@android:style/Widget.Button"> 
    <item name="android:background">@drawable/custom_button</item> 
    <item name="android:layout_width">fill_parent</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:layout_margin">3dp</item> 
    <item name="android:textColor">#ffffff</item> 
    <item name="android:gravity">center</item> 
    <item name="android:textSize">30sp</item> 
    <item name="android:textStyle">bold</item> 
    <item name="android:shadowColor">#000000</item> 
    <item name="android:shadowDx">1</item> 
    <item name="android:shadowDy">1</item> 
    <item name="android:shadowRadius">2</item> 
</style> 

Y en mi tema de la aplicación tengo

<item name="android:buttonStyle">@style/CustumButtonStyle</item> 

Y no es mi diseño:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/RelativeLayout1" 
android:layout_width="fill_parent" 
android:background="@drawable/grid" 
android:gravity="center" 
android:orientation="vertical" android:layout_height="fill_parent"> 

<Button 
    android:id="@+id/buttonContinue" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_gravity="center" 
    android:gravity="center" 
    android:text="@string/continue_game" android:layout_marginTop="3dp" android:layout_marginBottom="3dp"/> 



<Button 
    android:id="@+id/buttonNewGame" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/buttonContinue" 
    android:layout_alignRight="@+id/buttonContinue" 
    android:layout_below="@+id/buttonContinue" 
    android:layout_gravity="center" 
    android:gravity="center" 
    android:text="@string/new_game" android:layout_marginTop="3dp" android:layout_marginBottom="3dp"/> 



<Button 
    android:id="@+id/ButtonAbout" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/buttonNewGame" 
    android:layout_alignRight="@+id/buttonNewGame" 
    android:layout_below="@+id/buttonNewGame" 
    android:layout_gravity="center" 
    android:gravity="center" 
    android:text="@string/about" android:layout_marginTop="3dp" android:layout_marginBottom="3dp"/> 

+0

En sus pantallas tienen el mismo aspecto. Asegúrese de que su escala de visor sea 100% –

+0

¿Puede escribir los atributos del botón que está utilizando? El tamaño del texto no tiene nada que ver con su problema. – PravinCG

+0

@PravinCG He añadido algo de información, consulte la primera publicación – forcelain

Respuesta

133

@forcelain Creo que necesita comprobar esto Google IO Pdf for Design. En ese pdf ir a la página No: 77 en el que se encuentra como no sugiere el uso de dimens.xml para diferentes dispositivos de Android para ver Ejemplo A continuación la estructura:

res/values/dimens.xml 

res/values-small/dimens.xml 

res/values-normal/dimens.xml 

res/values-large/dimens.xml 

res/values-xlarge/dimens.xml 

Por ejemplo, usted ha usado más adelante en dimens.xml valores.

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="text_size">18sp</dimen> 
</resources> 

En la carpeta de otros valores debe cambiar los valores para el tamaño del texto.

Nota: Según lo indicado por @espinchi el pequeño, normal, grande y xlarge han quedado obsoletos desde Android 3.2 a favor de los siguientes:

Declaring Tablet Layouts for Android 3.2

Por primera generación de tablets con Android 3.0, la forma correcta de declarar diseños de tabletas era ponerlos en un directorio con el calificador de configuración XLarge (por ejemplo, res/layout-xlarge /). En para acomodar otros tipos de tabletas y tamaños de pantalla, en particular, tabletas de 7 ": Android 3.2 introduce una nueva forma de especificar los recursos de para tamaños de pantalla más discretos. La nueva técnica se basa en en la cantidad de espacio que su diseño necesidades (como 600dp de ancho), lugar de tratar de hacer que su diseño se ajusta a los grupos de tamaño generalizadas (tales como grandes o que lo normal).

la razón de diseño para tabletas de 7" es complicado cuando se utiliza el tamaño generalizada grupos es que una tableta de 7 "está técnicamente en el mismo grupo que un teléfono de 5" (el grupo grande). Si bien estos dos dispositivos son aparentemente uno cerca del otro en tamaño, la cantidad de espacio para una interfaz de usuario de la aplicación es significativamente diferente, al igual que el estilo de interacción del usuario . Por lo tanto, una pantalla de 7 "y 5" no siempre debe usar el mismo diseño . Para que sea posible proporcionar diferentes diseños para estos dos tipos de pantallas, Android ahora le permite especificar sus recursos de diseño basados ​​en el ancho y/o alto que realmente es disponible para el diseño de su aplicación, especificado en unidades dp.

Por ejemplo, una vez que haya diseñado el diseño que desea usar para dispositivos de tableta tipo , puede determinar que el diseño deja de funcionar cuando la pantalla tiene menos de 600dp de ancho. Este umbral se convierte así en el tamaño mínimo que necesita para el diseño de su tableta. Como tal, ahora puede especificar que estos recursos de diseño deben ser utilizados solo cuando hay al menos 600 pb de ancho disponible para la interfaz de usuario de la aplicación .

Debe elegir un ancho y un diseño como su tamaño mínimo, o probar cuál es el ancho más pequeño que admite su diseño una vez que es completo.

Nota: Recuerde que todas las cifras utilizadas con estas nuevas API de tamaño son valores independientes de la densidad de píxeles (dp) y sus dimensiones del diseño debe también siempre puede definir mediante unidades dp, porque lo que importa acerca es la cantidad de espacio en la pantalla disponible después de que el sistema tenga en cuenta la densidad de la pantalla (en oposición a la resolución del píxel bruto ). Para obtener más información acerca de los píxeles independientes de la densidad, lea Términos y conceptos, anteriormente en este documento. Utilizando nuevo tamaño calificadores

Las diferentes configuraciones de recursos que se pueden especificar en base a el espacio disponible para su diseño se resumen en la tabla 2. Estos nuevos calificadores que ofrecen un mayor control sobre la pantalla específica tamaños que disponible la aplicación, en comparación con el tamaño de pantalla tradicional grupos (pequeño, normal, grande y xlarge).

Nota: Los tamaños que especifique con estos calificadores no son los tamaños de pantalla reales .Por el contrario, los tamaños son para el ancho o alto en unidades dp que están disponibles para la ventana de su actividad. El sistema Android puede usar parte de la pantalla de la IU del sistema (como la barra del sistema en la parte inferior de la pantalla o la barra de estado en la parte superior), por lo que es posible que no esté disponible para su diseño. Por lo tanto, los tamaños que declare deberían ser específicamente sobre los tamaños necesarios para su actividad : el sistema representa cualquier espacio utilizado por la interfaz de usuario del sistema cuando declara cuánto espacio proporciona para su diseño. Tenga también en cuenta que Action Bar se considera parte del espacio de la ventana de su aplicación, aunque su diseño no lo declara, por lo que reduce el espacio disponible para su diseño y debe contabilizarlo en su diseño .

Tabla 2. Nuevos calificadores de configuración para el tamaño de pantalla (introducido en Android 3.2). Configuración de la pantalla Calificador Valores Descripción smallestWidth IDAM

Ejemplos: sw600dp sw720dp

El tamaño fundamental de una pantalla, como se indica por la dimensión más corta del área de pantalla disponible. Específicamente, el smallestWidth del dispositivo es el más corto de la altura disponible de la pantalla y el ancho de (también puede considerarlo como el "ancho más pequeño posible" para en la pantalla). Puede usar este calificador para asegurarse de que, independientemente de la orientación actual de la pantalla, su aplicación tenga al menos dps de ancho disponible para su UI.

Por ejemplo, si su diseño requiere que su dimensión más pequeña de área de la pantalla sea de al menos 600 dp en todo momento, a continuación, se puede utilizar este calificador para crear los recursos de diseño, res/layout-sw600dp /. El sistema utilizará estos recursos solo cuando la dimensión más pequeña de la pantalla disponible sea de al menos 600dp, independientemente de si el lado de 600dp es el ancho o la altura percibida por el usuario. El más pequeño Ancho es una característica de tamaño de pantalla fija del dispositivo; el smallestWidth del dispositivo no cambia cuando cambia la orientación de la pantalla.

El ancho más pequeño de un dispositivo tiene en cuenta las decoraciones de pantalla y la interfaz de usuario del sistema. Por ejemplo, si el dispositivo tiene algunos elementos persistentes UI en la pantalla que representan espacio a lo largo del eje del smallestWidth, el sistema declara que el menor ancho es menor que el tamaño de pantalla real, porque esos son píxeles de pantalla no disponible para su UI.

Esta es una alternativa a la fase de clasificación de tamaño de pantalla generalizada (pequeña, normal, grande, XLarge) que le permite definir un número discreto para el tamaño efectivo disponible para la interfaz de usuario. El uso de smallestWidth para determinar el tamaño general de la pantalla es útil porque ancho suele ser el factor determinante en el diseño de un diseño. Una IU se a menudo se desplaza verticalmente, pero tiene restricciones bastante duras en el espacio mínimo que necesita horizontalmente. El ancho disponible también es el factor clave para determinar si se usa un diseño de un panel para los teléfonos o el diseño de paneles múltiples para tabletas. Por lo tanto, es probable que le importe más cuál será el ancho más pequeño posible en cada dispositivo. pantalla disponible anchura wdp

Ejemplos: w720dp w1024dp

Especifica una anchura disponible mínimo en unidades dp en la que los recursos deben ser definidos utilizado por el valor. El valor correspondiente del sistema para el ancho cambia cuando la orientación de la pantalla cambia entre horizontal y vertical para reflejar el ancho real actual que está disponible para su UI.

Esto suele ser útil para determinar si se debe utilizar un diseño de múltiples hojas, porque incluso en un dispositivo de tableta, a menudo no se desea que el mismo diseño de varios paneles para la orientación vertical como lo hace para el paisaje. Por lo tanto, puede usar esto para especificar el ancho mínimo requerido para el diseño , en lugar de usar el calificador de orientación y el tamaño de pantalla juntos. Disponible altura de la pantalla HDP

Ejemplos: h720dp h1024dp etc.

Especifica una altura de protección mínimo en unidades dp en la que los recursos deben ser definidos utilizado por el valor. El valor correspondiente del sistema para la altura cambia cuando la orientación de la pantalla cambia entre horizontal y vertical para reflejar la altura real actual que está disponible para su UI.

Usar esto para definir la altura requerida por su diseño es útil en de la misma manera que wdp para definir el ancho requerido, en lugar de utilizando el tamaño de pantalla y los calificadores de orientación. Sin embargo, la mayoría de las aplicaciones no necesitarán este calificador, teniendo en cuenta que las IU suelen desplazarse verticalmente en y, por lo tanto, son más flexibles con la altura disponible , mientras que el ancho es más rígido.

Si bien el uso de estos calificadores puede parecer más complicado que usar los grupos de tamaño de pantalla , en realidad debería ser más simple una vez que determine los requisitos para su UI. Cuando diseña su interfaz de usuario, probablemente lo que más le preocupa es el tamaño real en el que su aplicación cambia entre una interfaz de usuario tipo auricular y una interfaz de usuario de tableta que usa paneles múltiples. El punto exacto de este cambio dependerá de su diseño particular ; tal vez necesite un ancho de 720 pb para el diseño de su tableta, tal vez 600dp es suficiente, o 480dp, o algún número entre estos. Usando estos calificadores en la tabla 2, usted tiene el control del tamaño preciso en que cambia su diseño.

Para obtener más información sobre estos calificadores de configuración de tamaño, consulte el documento Proporcionar recursos. Ejemplos de configuración

Para ayudar a apuntar algunos de sus diseños para diferentes tipos de dispositivos, aquí están algunos números para anchos de pantalla típicos:

320dp: a typical phone screen (240x320 ldpi, 320x480 mdpi, 480x800 hdpi, etc). 
480dp: a tweener tablet like the Streak (480x800 mdpi). 
600dp: a 7” tablet (600x1024 mdpi). 
720dp: a 10” tablet (720x1280 mdpi, 800x1280 mdpi, etc). 

El uso de la fase de clasificación del tamaño de la tabla 2, la aplicación puede cambiar entre sus diferentes recursos de diseño para auriculares y tabletas usando cualquier número que desee para ancho y/o alto.Por ejemplo, si 600dp es la anchura disponible más pequeño admitido por su diseño de la tableta, puede proveer estos dos conjuntos de diseños:

res/layout/main_activity.xml # para teléfonos res/layout-sw600dp/main_activity. xml # Para tabletas

En este caso, el ancho más pequeño del espacio de pantalla disponible debe ser 600dp para aplicar el diseño de la tableta.

Para otros casos en los que desea personalizar aún más su interfaz de usuario para diferenciar entre los tamaños, tales como 7” y 10” tabletas, puede definir adicionales diseños más pequeños ancho:

res/layout/main_activity.xml # Para teléfonos (más pequeño que 600dp disponible ancho) res/layout-sw600dp/main_activity.xml # para 7” comprimidos (600dp anchas y más grandes) res/layout-sw720dp/main_activity.xml

para 10” tabletas (720dp de ancho y más grande)

Observe que los dos conjuntos anteriores de recursos de ejemplo usan el calificador de "ancho más pequeño" , swdp, que especifica el más pequeño de los lados de la pantalla, independientemente de la orientación actual del dispositivo . Por lo tanto, usar swdp es una manera simple de especificar el tamaño de pantalla general disponible para su diseño ignorando la orientación de la pantalla .

Sin embargo, en algunos casos, lo que podría ser importante para su diseño es exactamente cuánto ancho o alto está disponible actualmente. Por ejemplo, si tiene un diseño de dos paneles con dos fragmentos uno al lado del otro, es posible que desee usarlo siempre que la pantalla proporcione al menos 600 pb de ancho , independientemente de si el dispositivo está en orientación horizontal o vertical. En este caso, sus recursos podría tener este aspecto:

res/layout/main_activity.xml # Para teléfonos (más pequeño que 600dp disponibles anchura) res/layout-w600dp/main_activity.xml # Multi-panel (cualquier pantalla con 600dp de ancho disponible o más)

Observe que el segundo conjunto utiliza el calificador de "ancho disponible", wdp. De esta forma, un dispositivo puede usar ambos diseños, dependiendo de en la orientación de la pantalla (si el ancho disponible es al menos 600dp en una orientación y menos de 600dp en la otra orientación ).

Si la altura disponible es una preocupación para usted, entonces puede hacer lo mismo usando el calificador hdp. O incluso combine los calificadores wdp y hdp si necesita ser realmente específico.

+1

El enlace está muerto, por favor, corrija – Boy

+0

@Boy Sí, voy a encontrar ese pdf y lo actualizaré pronto – Herry

+7

Estos pequeños/normales/grandes/xlarge están en desuso en este momento (diciembre de 2014). La forma preferida ahora es usar "swxxxdp". Consulte http://developer.android.com/guide/practices/screens_support.html#range – espinchi

7

yo misma por dimensión y pintura algo así como (con dp pero sólo para el texto y en drawText())

XML:

<dimen name="text_size">30sp</dimen> 

Código:

Paint p =new Paint(); 
     p.setTextSize(getResources().getDimension(R.dimen.text_Size)); 
+4

NO debe usar 'dp' para tamaño de texto ... use' sp' en su lugar. –

+0

utilice sp para tamaño de texto – Thinsky

2

Creo que se puede archivar que al añadir recursos de diseño múltiple para cada tamaño de la pantalla, por ejemplo:

res/layout/my_layout.xml    // layout for normal screen size ("default") 
res/layout-small/my_layout.xml  // layout for small screen size with small text 
res/layout-large/my_layout.xml  // layout for large screen size with larger text 
res/layout-xlarge/my_layout.xml  // layout for extra large screen size with even larger text 
res/layout-xlarge-land/my_layout.xml // layout for extra large in landscape orientation 

Referencia: 1. http://developer.android.com/guide/practices/screens_support.html

+1

Utilice res/values-small puede ser mejor. – einverne

+0

una de las peores implementaciones. tenemos que mantener 5 diseños solo para admitir diferentes tamaños? – SolidSnake

-2

No codificar los tamaños.

Para una mayor flexibilidad del anuncio de nuevas resoluciones de pantalla - la mejor práctica es colocar Vista de Texto simulado en disposición de obtener el TEXTSIZE:

<TextView 
     android:id="@+id/dummyTextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:visibility="gone" 
     android:text="TextView" /> 

Y en su código, por ejemplo:

TextView testTextView = (TextView) rootView.findViewById(R.id.dummyTextView); 
float textSize = testTextView.getTextSize(); 

Mantenga textSize como una referencia a la que puede agregar un tamaño constante o de porcentaje (calculando).

6

A veces, es mejor tener sólo tres opciones

style="@android:style/TextAppearance.Small" 

Uso pequeños y grandes de diferenciar de tamaño de pantalla normal.

<TextView 
      android:id="@+id/TextViewTopBarTitle" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      style="@android:style/TextAppearance.Small"/> 

Para la normalidad, no es necesario que especifique nada.

<TextView 
      android:id="@+id/TextViewTopBarTitle" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"/> 

uso de este, se puede evitar la prueba y dimensiones que especifican para diferentes tamaños de pantalla.

-1

Como @espinchi mencionado de 3.2 (nivel de API 13) los grupos de tamaño están en desuso. Screen size ranges son el enfoque favorito en el futuro.

4

Creo que es demasiado tarde para responder sobre este hilo. Pero me gustaría compartir mi idea o forma de resolver el problema del tamaño del texto sobre los dispositivos de resolución de diferencias. Muchos sitios de desarrolladores de Android sugieren que tenemos que usar la unidad sp para el tamaño de texto que manejará el tamaño del texto para dispositivos de resolución de diferencias. Pero siempre soy incapaz de obtener el resultado deseado. Así que he encontrado una solución que estoy usando de mis últimos 4-5 proyectos y está funcionando bien. Según mi sugerencia, debe colocar el tamaño de texto para cada dispositivo de resolución, lo cual es un trabajo un poco tedioso, pero cumplirá con sus requisitos. Cada desarrollador debe escuchar la relación como 4: 6: 8: 12 (h: xh: xxh: xxxh respectivamente). Ahora dentro de su proyecto res carpeta debe crear 4 carpetas con el archivo dimens, p. Ej.

  1. res/valores-IPAP/dimens.xml
  2. res/valores-xhdpi/dimens.xml
  3. res/valores-xxhdpi/dimens.xml
  4. res/valores-xxxhdpi/Dimens. xml

Ahora dentro del archivo dimens.xml tiene que colocar tamaños de texto. Estoy mostrando el código para values-hdpi, del mismo modo debe colocar el código para otros valores de resolución/dimens.xml.

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="text_size">4px</dimen> 
</resources> 

Para otras resoluciones es como xhdpi: 6px, xxhdpi: 8px, xxxhdpi: 12 píxeles. Esto se calcula con la proporción (3: 4: 6: 8: 12) que he escrito arriba. Permite analizar otro ejemplo de tamaño de texto con la relación anterior.Si usted quiere tomar el tamaño del texto de 12 píxeles en IPAP, a continuación, en otra resolución que sería

  1. IPAP: 12px
  2. xhdpi: 18px
  3. xxhdpi: 24px
  4. xxxhdpi: 36px

Esta es la solución simple para implementar el tamaño de texto requerido para todas las resoluciones. No estoy considerando valores-mdpi dispositivos de resolución aquí. Si alguien quiere incluir el tamaño del texto para esta resolución, la ración es como 3: 4: 6: 8: 12. En cualquier consulta, házmelo saber. Espero que te ayude a la gente.

Cuestiones relacionadas