SetWidth (int pixels) usa dip ou px?

95

SetWidth (int pixels) usa pixel independente de dispositivo ou pixel físico como unidade? Por exemplo, setWidth (100) define a largura de uma visualização como 100 inclinações ou 100 pxs?

Obrigado.

user256239
fonte

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()));
Dan Lew
fonte
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.

SDJMcHattie
fonte
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());
Nidhin
fonte
4
float dps = 100;
float pxs = dps * getResources().getDisplayMetrics().density;

Fonte (@Romain Guy)

pomber
fonte
0

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

Josnidhin
fonte
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());
    }
Abhishek Garg
fonte