SetWidth (int pixels) usa dip ou px?


Respostas:


221

Ele usa pixels, mas tenho certeza de que você está se perguntando como usar mergulhos. A resposta está em TypedValue.applyDimension(). Aqui está um exemplo de como converter quedas em px no código:

// Converts 14 dip into its equivalent px
Resources r = getResources();
int px = Math.round(TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_DIP, 14,r.getDisplayMetrics()));

64
Você também pode chamar nbDips * getResources (). GetDisplayMetrics (). Density
Romain Guy,

9
Na verdade, é exatamente isso que TypedValue.applyDimension () faz. Pensei em postar isso, mas gosto de examinar a API caso algo mude ... embora eu ache que é seguro usar esse método se você permitir. :)
Dan Lew,

12
A versão applyDimension () executa mais código e é um pouco mais difícil de ler, eu acho. FWIW, a linha que postei é o que realmente usamos em todo o lugar no framework e aplicativos padrão.
Romain Guy,

1
Oi, eu tentei os dois exemplos acima e não parece calcular os pixels corretamente. em vez disso, ele retorna o valor exato que eu especifico em minha visão: android: layout_width = "50dip" no meu caso. ele me retornará 50 o valor exato no arquivo xml. Em seguida, verifiquei isso no aplicativo e, como esperado, o valor está incorreto e desenha a visualização muito grande do que o esperado
Jonathan

A única solução que encontrei para conversão de px para pt, muito legal.
A-Live

24

A maneira correta de obter um número constante de DIPs no código é criar um arquivo XML de recursos contendo valores dp um pouco como:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="image_width">100dp</dimen>
    <dimen name="image_height">75dp</dimen>
</resources>

Em seguida, consulte o recurso em seu código da seguinte maneira:

float width = getResources().getDimension(R.dimen.image_width));
float height = getResources().getDimension(R.dimen.image_height));

O float que você retornou será dimensionado de acordo com a densidade de pixels do dispositivo e, portanto, você não precisa ficar replicando um método de conversão em todo o seu aplicativo.


Na minha situação, esta solução funciona melhor onde eu tenho uma caixa de diálogo personalizada que tem uma exibição de lista e desejo definir a largura dos rótulos de cabeçalho e colunas em ListView com a mesma largura.
Wayne Phipps

Sua primeira frase é meio engraçada, você está basicamente dizendo que criar um arquivo XML é a maneira correta de "especificar [algo] no código" . Bem, acho que você está apenas usando a constante no código, sem especificá-la :)
Joffrey

@Joffrey sim, entendo o que você quer dizer, então atualizei um pouco o texto
SDJMcHattie

7

Método setWidth (100), defina 100 px como largura (não em dp). Portanto, você pode enfrentar problemas de largura em diferentes telefones Android. Portanto, use a medição em dp em vez de pixels. Use o código abaixo para obter a medição em dp da largura da amostra = 300px e altura = 400px.

int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, getResources().getDisplayMetrics());

int Height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 400, getResources().getDisplayMetrics());


0

Pixels é claro, o método pede pixels como parâmetro.


1
Se estiver em um arquivo XML de layout, podemos especificar android: layout_width = "100dip" ou android: layout_width = "100px". No código-fonte, não podemos especificar a largura de um layout como 100dip?
user256239

Não diretamente, você precisa se converter usando DisplayMetrics.density.
Romain Guy,

0

Com base nas respostas acima que funcionam bem para mim, eu gerei alguns métodos auxiliares , basta adicioná-los em seus utils para usá-los em todo o projeto.

   // value in DP
   public static int getValueInDP(Context context, int value){
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
    }

    public static float getValueInDP(Context context, float value){
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
    }

    // value in PX
    public static int getValueInPixel(Context context, int value){
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
    }

    public static float getValueInPixel(Context context, float value){
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
    }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.