Tamanho do texto e diferentes tamanhos de tela do Android

121

Eu sei, isso já foi discutido mil vezes, mas não consigo ajustar o tamanho do texto para diferentes tamanhos de tela. Eu tento usar 'sp' como unidades de tamanho no meu estilo personalizado:

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

No 2.7 QVGA, parece OK:

2.7QVGA 30sp

Mas no WSVGA de 7 polegadas fica assim:

7in WSVGA 30sp

Eu tentei usar 'sp' e 'dp' com o mesmo resultado.

Poderia explicar como fazer com que esses botões pareçam iguais em qualquer tela?

O estilo completo do botão personalizado

<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>

E no meu tema de aplicação eu tenho

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

E aqui está o meu layout:

<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"/>

forcelain
fonte
Nas telas, elas parecem iguais. Certifique-se de que sua escala de visualizador seja 100%
Dmitry Zaytsev
Você pode encontrar respostas a partir daqui stackoverflow.com/questions/16706076/…
Bhavesh Jethani

Respostas:

160

@forcelain Acho que você precisa verificar este PDF de IO do Google para design . Nesse pdf, vá para a página no: 77, na qual você encontrará como sugerir o uso do dimens.xml para diferentes dispositivos do android, por exemplo, veja a estrutura abaixo:

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 exemplo, você usou abaixo de dimens.xml em valores.

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

Na pasta de outros valores, você precisa alterar os valores para o tamanho do texto.

Nota: Conforme indicado por @espinchi, small, normal, large e xlarge foram descontinuados desde o Android 3.2 em favor do seguinte:

Declarando layouts de tablet para Android 3.2

Para a primeira geração de tablets executando o Android 3.0, a maneira correta de declarar layouts de tablets era colocá-los em um diretório com o qualificador de configuração xlarge (por exemplo, res / layout-xlarge /). Para acomodar outros tipos de tablets e tamanhos de tela - em particular, tablets de 7 "-, o Android 3.2 introduz uma nova maneira de especificar recursos para tamanhos de tela mais discretos. A nova técnica baseia-se na quantidade de espaço que seu layout precisa (como 600dp de largura), em vez de tentar ajustar seu layout aos grupos de tamanhos generalizados (como grandes ou grandes).

A razão pela qual o design de tablets de 7 "é complicado ao usar os grupos de tamanho generalizado é que um tablet de 7" está tecnicamente no mesmo grupo que um telefone de 5 "(o grupo grande). Embora esses dois dispositivos estejam aparentemente próximos um do outro em tamanho , a quantidade de espaço para a interface do usuário de um aplicativo é significativamente diferente, assim como o estilo de interação do usuário. Portanto, uma tela de 7 "e 5" nem sempre deve usar o mesmo layout. Para possibilitar o fornecimento de layouts diferentes para esses Com dois tipos de tela, o Android agora permite que você especifique seus recursos de layout com base na largura e / ou altura realmente disponíveis para o layout do seu aplicativo, especificado nas unidades dp.

Por exemplo, depois de projetar o layout que você deseja usar para dispositivos estilo tablet, você pode determinar que o layout para de funcionar bem quando a tela tem menos de 600dp de largura. Esse limite se torna o tamanho mínimo necessário para o layout do tablet. Dessa forma, agora você pode especificar que esses recursos de layout devem ser usados ​​somente quando houver pelo menos 600dp de largura disponível para a interface do usuário do aplicativo.

Você deve escolher uma largura e projetá-la como seu tamanho mínimo ou testar qual é a menor largura que seu layout suporta depois de concluída.

Nota: Lembre-se de que todas as figuras usadas com essas novas APIs de tamanho são valores de pixels independentes da densidade (dp) e suas dimensões de layout também devem sempre ser definidas usando unidades de dp, porque você se importa com a quantidade de espaço na tela disponível após o sistema é responsável pela densidade da tela (em vez de usar a resolução de pixels brutos). Para obter mais informações sobre pixels independentes da densidade, leia Termos e conceitos, anteriormente neste documento. Usando novos qualificadores de tamanho

As diferentes configurações de recursos que você pode especificar com base no espaço disponível para seu layout estão resumidas na tabela 2. Esses novos qualificadores oferecem mais controle sobre os tamanhos de tela específicos que seu aplicativo suporta, em comparação com os grupos de tamanho de tela tradicionais (pequeno, normal, grande e grande).

Nota: Os tamanhos especificados usando esses qualificadores não são os tamanhos de tela reais. Em vez disso, os tamanhos são para a largura ou altura em unidades dp disponíveis na janela da sua atividade. O sistema Android pode usar parte da tela da interface do usuário (como a barra do sistema na parte inferior da tela ou a barra de status na parte superior), portanto, parte da tela pode não estar disponível para o seu layout. Portanto, os tamanhos que você declara devem ser especificamente sobre os tamanhos necessários para sua atividade - o sistema responde por qualquer espaço usado pela interface do usuário do sistema ao declarar quanto espaço fornece para o seu layout. Lembre-se também de que a Barra de ação é considerada parte do espaço da janela do seu aplicativo, embora seu layout não o declare, portanto reduz o espaço disponível para o seu layout e você deve contabilizá-lo em seu design.

Tabela 2. Novos qualificadores de configuração para o tamanho da tela (introduzidos no Android 3.2). Configuração da tela Valores do qualificador Descrição smallestWidth swdp

Exemplos: sw600dp sw720dp

O tamanho fundamental de uma tela, conforme indicado pela menor dimensão da área de tela disponível. Especificamente, a menor largura do dispositivo é a menor altura e largura disponível da tela (você também pode pensar nela como a "menor largura possível" da tela). Você pode usar esse qualificador para garantir que, independentemente da orientação atual da tela, o aplicativo tenha pelo menos dps de largura disponível para a interface do usuário.

Por exemplo, se seu layout exigir que sua menor dimensão da área da tela seja pelo menos 600 dp o tempo todo, você poderá usar esse qualificador para criar os recursos de layout, res / layout-sw600dp /. O sistema usará esses recursos somente quando a menor dimensão da tela disponível for pelo menos 600dp, independentemente de o lado de 600dp ser a altura ou largura percebida pelo usuário. A menor largura é uma característica de tamanho de tela fixa do dispositivo; a menor largura do dispositivo não muda quando a orientação da tela muda.

A menor largura de um dispositivo leva em consideração as decorações da tela e a interface do usuário do sistema. Por exemplo, se o dispositivo tiver alguns elementos persistentes da interface do usuário na tela que representem espaço ao longo do eixo da menor largura, o sistema declarará que a menor largura será menor que o tamanho real da tela, porque esses pixels da tela não estão disponíveis para a sua interface do usuário.

Essa é uma alternativa aos qualificadores de tamanho de tela generalizados (pequeno, normal, grande, xlarge) que permitem definir um número discreto para o tamanho efetivo disponível para sua interface do usuário. Usar smallestWidth para determinar o tamanho geral da tela é útil porque a largura geralmente é o fator determinante no design de um layout. Uma interface do usuário costuma rolar verticalmente, mas possui restrições bastante rígidas no espaço mínimo necessário horizontalmente. A largura disponível também é o fator chave para determinar se o layout de painel único deve ser usado para aparelhos de mão ou o layout de painel múltiplo para tablets. Portanto, você provavelmente se preocupa mais com a menor largura possível em cada dispositivo. Largura de tela disponível wdp

Exemplos: w720dp w1024dp

Especifica uma largura disponível mínima em unidades dp nas quais os recursos devem ser usados ​​- definidos pelo valor. O valor correspondente do sistema para a largura muda quando a orientação da tela alterna entre paisagem e retrato para refletir a largura atual atual disponível para sua interface do usuário.

Isso geralmente é útil para determinar se é necessário usar um layout de painel múltiplo, porque mesmo em um tablet, você geralmente não deseja o mesmo layout de painel múltiplo para orientação retrato que para paisagem. Portanto, você pode usar isso para especificar a largura mínima necessária para o layout, em vez de usar os qualificadores de tamanho de tela e orientação juntos. HDP de altura de tela disponível

Exemplos: h720dp h1024dp etc.

Especifica uma altura mínima da tela em unidades dp nas quais os recursos devem ser usados ​​- definidos pelo valor. O valor correspondente do sistema para a altura muda quando a orientação da tela alterna entre paisagem e retrato para refletir a altura atual atual disponível para sua interface do usuário.

Usar isso para definir a altura exigida pelo seu layout é útil da mesma maneira que o wdp é para definir a largura necessária, em vez de usar os qualificadores de tamanho de tela e orientação. No entanto, a maioria dos aplicativos não precisará desse qualificador, considerando que as UIs costumam rolar verticalmente e, portanto, são mais flexíveis com a altura disponível, enquanto a largura é mais rígida.

Embora o uso desses qualificadores possa parecer mais complicado do que o uso de grupos de tamanho de tela, na verdade deve ser mais simples depois que você determinar os requisitos para sua interface do usuário. Quando você cria sua interface do usuário, o principal motivo de preocupação é o tamanho real no qual seu aplicativo alterna entre uma interface de usuário no estilo de telefone e uma interface de tablet que usa vários painéis. O ponto exato dessa opção dependerá do seu design específico - talvez você precise de uma largura de 720dp para o layout do seu tablet, talvez 600dp seja suficiente ou 480dp ou algum número entre eles. Usando esses qualificadores na tabela 2, você controla o tamanho exato em que seu layout é alterado.

Para obter mais discussões sobre esses qualificadores de configuração de tamanho, consulte o documento Fornecendo recursos. Exemplos de configuração

Para ajudar você a segmentar alguns de seus projetos para diferentes tipos de dispositivos, veja alguns números para larguras de tela comuns:

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).

Usando os qualificadores de tamanho da tabela 2, seu aplicativo pode alternar entre os diferentes recursos de layout de aparelhos e tablets usando o número desejado para largura e / ou altura. Por exemplo, se 600dp for a menor largura disponível suportada pelo layout do tablet, você poderá fornecer estes dois conjuntos de layouts:

res / layout / main_activity.xml # Para aparelhos celulares res / layout-sw600dp / main_activity.xml # Para tablets

Nesse caso, a menor largura do espaço disponível na tela deve ser 600dp para que o layout da mesa gráfica seja aplicado.

Para outros casos em que você deseja personalizar ainda mais a interface do usuário para diferenciar tamanhos, como tablets de 7 "e 10", é possível definir layouts adicionais de menor largura:

res / layout / main_activity.xml # Para aparelhos celulares (largura menor que 600dp disponível) res / layout-sw600dp / main_activity.xml # Para tablets de 7 ”(600dp de largura ou mais) res / layout-sw720dp / main_activity.xml

Para tablets de 10 ”(720dp de largura e maior)

Observe que os dois conjuntos anteriores de recursos de exemplo usam o qualificador "menor largura", swdp, que especifica o menor dos dois lados da tela, independentemente da orientação atual do dispositivo. Portanto, usar swdp é uma maneira simples de especificar o tamanho geral da tela disponível para o seu layout, ignorando a orientação da tela.

No entanto, em alguns casos, o que pode ser importante para o seu layout é exatamente a quantidade de largura ou altura disponível no momento. Por exemplo, se você tiver um layout de dois painéis com dois fragmentos lado a lado, convém usá-lo sempre que a tela tiver pelo menos 600dp de largura, independentemente de o dispositivo estar na orientação paisagem ou retrato. Nesse caso, seus recursos podem ser assim:

res / layout / main_activity.xml # Para aparelhos celulares (largura menor que 600dp disponível) res / layout-w600dp / main_activity.xml # Multi-painel (qualquer tela com largura disponível de 600dp ou mais)

Observe que o segundo conjunto está usando o qualificador "largura disponível", wdp. Dessa forma, um dispositivo pode realmente usar os dois layouts, dependendo da orientação da tela (se a largura disponível for de pelo menos 600dp em uma orientação e menor que 600dp na outra orientação).

Se a altura disponível for uma preocupação para você, faça o mesmo usando o qualificador hdp. Ou então, combine os qualificadores wdp e hdp se precisar ser realmente específico.

Herry
fonte
7
Esses valores pequeno / normal / grande / xlarge estão obsoletos no momento (dezembro de 2014). A maneira preferida agora é usar "swxxxdp". Veja developer.android.com/guide/practices/…
espinchi
1
@espinchi obrigado, você deve postar isso também como resposta. Existem também alguns dp's recomendados? por exemplo, os padrões são: 100sw, 200sw, 400sw, 600sw.
Vince V.
19

Eu acho que é tarde demais para responder a esta discussão. Mas gostaria de compartilhar minha ideia ou maneira de resolver o problema do tamanho do texto em dispositivos de resolução de diferenças. Muitos sites de desenvolvedores do Android sugerem que precisamos usar a unidade sp para o tamanho do texto, que manipulará o tamanho do texto para dispositivos de resolução de diferenças. Mas eu sempre sou incapaz de obter o resultado desejado. Então, eu encontrei uma solução que estou usando nos meus últimos 4-5 projetos e está funcionando bem. De acordo com a minha sugestão, você deve colocar o tamanho do texto para cada dispositivo de resolução, o que é um trabalho tedioso, mas ele atenderá às suas necessidades. Cada desenvolvedor deve ouvir sobre a proporção como 4: 6: 8: 12 (h: xh: xxh: xxxh respectivamente) . Agora, dentro da pasta res do projeto, você deve criar 4 pastas com o arquivo dimens, por exemplo

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

Agora, dentro do arquivo dimens.xml, você deve colocar tamanhos de texto. Estou mostrando o código para valores-hdpi , da mesma forma que você deve colocar o código para outros valores de resolução / arquivo dimens.xml.

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

Para outras resoluções, é como xhdpi : 6px, xxhdpi : 8px , xxxhdpi : 12px. Isso é calculado com a razão (3: 4: 6: 8: 12) que escrevi acima. Vamos discutir outro exemplo de tamanho de texto com a proporção acima. Se você deseja obter um tamanho de texto de 12 px em hdpi, em outra resolução seria

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

Esta é a solução simples para implementar o tamanho de texto necessário para todas as resoluções. Não estou considerando dispositivos de resolução de valores-mdpi aqui. Se alguém quiser incluir o tamanho do texto para esta resolução, a ração é como 3: 4: 6: 8: 12 . Em qualquer consulta, por favor me avise. Espero que ajude as pessoas.

Rahul Sharma
fonte
4
Não é uma prática recomendada usar px em vez de sp no tamanho do texto? Existe uma maneira de alcançar a seguinte proporção usando sp em vez de px?
Red M
Verifiquei que isso está funcionando bem, mas ainda estou confuso. É uma boa prática usar valores em px em vez de dp / sp? Eu nunca vi em algum lugar da documentação oficial usar valores em px.
shaby
1
use sp para o tamanho da fonte, essa é a lei. A abordagem que Rahul mostrou está correta, basta usar sp em vez de px.
Mihir Patel
sp deve ser usado se estiver planejando vincular o tamanho da fonte do aplicativo ao tamanho da fonte do sistema. Caso contrário, esta solução não será ruim.
Irfan Ul Haq
12

Às vezes, é melhor ter apenas três opções

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

Use pequeno e grande para diferenciar do tamanho normal da tela.

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

Para o normal, você não precisa especificar nada.

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

Com isso, você pode evitar testar e especificar dimensões para diferentes tamanhos de tela.

Kalan Nawarathne
fonte
10

Eu fiz o mesmo por dimensão e pintei algo como (com dp, mas apenas para texto e em drawText ())

XML:

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

Código:

   Paint p =new Paint();
       p.setTextSize(getResources().getDimension(R.dimen.text_Size));
Estilo de vida
fonte
8
Você NÃO deve usar dppara tamanho de texto ... use em seu splugar.
Yousha Aleayoub
por favor use sp para tamanho de texto
Thinsky 22/11
Você pode usar o dp em situações específicas quando não deseja que seja redimensionado com base na preferência do usuário.
7

Todos podem usar a biblioteca android mencionada abaixo, que é a maneira mais fácil de tornar os tamanhos de texto compatíveis com quase todas as telas de dispositivos. Na verdade, ele foi desenvolvido com base nos novos qualificadores de configuração do Android para o tamanho da tela (introduzido no Android 3.2) SmallestWidth swdp.

https://github.com/intuit/sdp

Muhammad Maqsood
fonte
2
sdp é para o tamanho da tela; use ssp para tamanho de texto
ecle 12/01/19
Isso funciona para mim, mas eu suspeito que há demais arquivos para adicionar, isso vai aumentar o tamanho do aplicativo, @Muhammad você pode redimensionar e adicionar apenas as classes tudo o que precisa
Kirtikumar A.
1

Se você possui a API 26, considere usar o autoSizeTextType :

<Button
  app:autoSizeTextType="uniform" />

A configuração padrão permite que o dimensionamento automático do TextView seja dimensionado uniformemente nos eixos horizontal e vertical.

https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview

Bonne Bogaert
fonte
O problema é que ele não altera uniformemente o tamanho do texto para várias visualizações de texto com seqüências de caracteres de diferentes comprimentos
Sourabh S Nath
0

Eu acho que você pode arquivar isso adicionando vários recursos de layout para cada tamanho de tela, por exemplo:

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

Referência: 1. http://developer.android.com/guide/practices/screens_support.html

NguyenDat
fonte
2
Use res / valores-pequeno pode ser melhor.
einverne
1
uma das piores implementações. temos que manter 5 layouts apenas para suportar tamanhos diferentes?
SolidSnake
Criar layouts diferentes para reduzir o tamanho do texto em telas variantes é uma péssima idéia. Eu não recomendo isso
Saman Salehi
0

Para unificar todas as telas para mostrar os mesmos tamanhos de elemento, incluindo o tamanho da fonte: - Projete a interface do usuário em um tamanho de tela com os tamanhos que achar adequados durante o design, ou seja, o tamanho da fonte do TextView é 14dp no tamanho de tela padrão de 4'6 polegadas.

  • Calcule programaticamente o tamanho físico da tela dos outros telefones, ou seja, 5'2 polegadas dos outros telefones / telas.

  • Use uma fórmula para calcular a diferença percentual entre as duas telas. ou seja, qual é a diferença percentual entre 4'6 e 5'2.

  • Calcule a diferença de pixels entre os 2 TextViews com base na fórmula acima.

  • Obtenha o tamanho real (em pixels) do tamanho da fonte do TextView e aplique a diferença de pixels (calculada anteriormente) ao tamanho da fonte padrão.

Dessa forma, você pode aplicar a proporção dinâmica a todos os tamanhos de tela e o resultado é ótimo. Você terá tamanhos e layout idênticos em cada tela.

Pode ser um pouco complicado no começo, mas atinge totalmente o objetivo quando você descobrir a fórmula. Com esse método, você não precisa criar vários layouts apenas para ajustar-se a diferentes tamanhos de tela.

SolidSnake
fonte
0

Você também pode usar weightSume layout_weightproperty para ajustar sua tela diferente.

Para isso, você deve fazer android:layout_width= 0dp e android:layout_width= (o que quiser);

Harshit
fonte
-1

Como o @espinchi mencionado em 3.2 (nível 13 da API), os grupos de tamanhos foram preteridos. Os intervalos de tamanho de tela são a abordagem preferida no futuro.

Jacques Kammeyer
fonte
-2

Não codifique os tamanhos.

Para flexibilidade e novas resoluções de tela - a melhor prática é colocar o TextView fictício no layout para obter o textSize:

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

E no seu código, por exemplo:

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

Mantenha textSizecomo uma referência à qual você pode adicionar um tamanho constante ou de porcentagem (calculando).

Athlan
fonte