SetWidth(int pixels)は、デバイスに依存しないピクセルまたは物理ピクセルを単位として使用しますか?たとえば、setWidth(100)はビューの幅を100ディップまたは100ピクセルに設定しますか?
ありがとう。
ピクセルを使用しますが、代わりにディップを使用する方法を疑問に思っていると確信しています。答えは TypedValue.applyDimension()
にあります。コードでディップをpxに変換する方法の例を次に示します。
// Converts 14 dip into its equivalent px
Resources r = getResources();
int px = Math.round(TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 14,r.getDisplayMetrics()));
コードで一定数のDIPを取得する正しい方法は、次のようなdp値を含むリソースXMLファイルを作成することです。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="image_width">100dp</dimen>
<dimen name="image_height">75dp</dimen>
</resources>
次に、次のようにコード内のリソースを参照します。
float width = getResources().getDimension(R.dimen.image_width));
float height = getResources().getDimension(R.dimen.image_height));
返されたフロートは、デバイスのピクセル密度に応じてスケーリングされるため、アプリケーション全体で変換メソッドを複製し続ける必要はありません。
メソッドsetWidth(100)、幅として100 pxを設定します(dpではありません)。したがって、さまざまなAndroid電話で幅が変化する問題に直面する可能性があります。ピクセルではなくdpで測定を使用します。サンプル幅= 300ピクセル、高さ= 400ピクセルのdpで測定値を取得するコード。
int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, getResources().getDisplayMetrics());
int Height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 400, getResources().getDisplayMetrics());
float dps = 100;
float pxs = dps * getResources().getDisplayMetrics().density;
もちろんピクセルは、メソッドがパラメーターとしてピクセルを要求しています。
私にうまくいく上記の回答に基づいて、私はいくつかのヘルパーメソッドを生成し、それらをユーティリティに追加してプロジェクト全体で使用します。
// 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());
}