web-dev-qa-db-ja.com

xamarin.androidでdpをpxに変換する方法は?

C#コードxamarin.Androidでdpをpxに変換したいのですが、JavaコードがAndroid studio that xamarinにいくつかの問題があります。getResources()の代わりにResourcesを使用するような同等のものを使用しようとしましたが、いくつかの小さな問題を解決できましたが、まだいくつかの問題があります。それらに相当するものを見つけることができませんでした。ここに、xamarinの元のコード、私のコード、および私のコードの問題があります。

最初のコード

(プログラムに依存して、LayoutParamsの高さを密度に依存しないピクセルとして設定

Javaコード

int height = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, < HEIGHT >, getResources().getDisplayMetrics());

C#コード

int height = (int)TypedValue.ApplyDimension(TypedValue.COMPLEX_UNIT_DIP, < HEIGHT >, Resources.DisplayMetrics);

問題:

  • 「TypedValue」には「COMPLEX_UNIT_DIP」の定義が含まれていません

  • 無効な式の項<(>と同じエラー)

  • 「HEIGHT」という名前は現在のコンテキストに存在しません

2番目のコード

式pxからdp、dpからpx Android で見つかります)

Javaコード

DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));

C#コード

DisplayMetrics displayMetrics = Application.Context.Resources.DisplayMetrics;
int pixel = Math.Round(dp * (displayMetrics.Xdpi / DisplayMetrics.DensityDefault));

問題

  • 演算子 '/'は、タイプ 'float'および 'DisplayMetricsDensity'のオペランドには適用できません

今、私は実際に2つの質問があります。より適切なコードはどれですか? xamarin.androidの同等のコードは何ですか?

前もって感謝します。

11

「最初のコード」の解決策:

Xamarinは定数を独自の列挙型に移動する傾向があります。 COMPLEX_UNIT_DIPはComplexUnitType列挙型にあります。また、同等のピクセル値を取得するために実際にディップを渡す必要がある<HEIGHT>をコードに含めることはできません。以下の例では、100ディップでピクセルを取得しています。

var dp = 100;
int pixel = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, dp, Context.Resources.DisplayMetrics);

"2番目のコード"の解決策:

'DisplayMetrics.DensityDefault'を明示的にfloatにキャストし、ラウンド全体をintにキャストする必要があります。

int pixel = (int)System.Math.Round(dp * (displayMetrics.Xdpi / (float)DisplayMetrics.DensityDefault));

2番目のコードは特に「xディメンション」に沿って計算するため、最初のアプローチを好みます。PerAndroid docs and Xamarin.Android docs、Xdpi property is

「X次元での画面の1インチあたりの正確な物理ピクセル。」

14

これらは私が現在取り組んでいるプロジェクトからのものです。

public static float pxFromDp(Context context, float dp)
{
    return dp * context.Resources.DisplayMetrics.Density;
}

public static float dpFromPx(Context context, float px)
{
    return px / context.Resources.DisplayMetrics.Density;
}
6
HeisenBerg

dpからpx:


    DisplayMetrics displayMetrics = Application.Context.Resources.DisplayMetrics;
    double pixel = Math.Round((dp * DisplayMetrics.DensityDefault) + 0.5);

ここからの回答: https://stackoverflow.com/a/8490361/6949388

コメントするには十分な担当者がいません。

0
Mojo Allmighty