2

私は今、何日も取り組んでいる大きな問題を抱えています。最初に要件を見ればよく理解できます。私の要件を以下のポイント形式でできるだけ簡単にリストします.

  1. 私は5つのアンドロイド携帯を持っています。5 つの異なるブランド、異なる画面サイズ。
  2. 画面サイズが 4 インチ、4.5 インチ、5 インチ、5.1 インチ、5.2 インチであるとします。
  3. Android アプリがあり、描画キャンバスがあります。
  4. 今使っcanvas.drawCircle(x / 2, y / 2, radius, paint)て円を描いています。半径が 100 (100 ピクセル?) だと想像してください。
  5. 私はこのアプリを私の最小画面の携帯電話である 4 インチにインストールします。次に定規を使って円の直径を測ります。円の直径が「正確な」3cmだと想像してください。
  6. 今、私はこれを私の他の電話にインストールします。
  7. 残念ながら、私の 4.5 インチの携帯電話では、円の直径は 3.2cm です。5 インチの携帯電話では 3.3 cm です。5.1 インチの電話では 2.8cm などです。
  8. ただし、すべての電話で円の直径を 3cm (正確には 3cm) にしたいと考えています。

上記の要件は、私が今何日も試みているものです。すべての画面でサイズが変わらない円を取得するために、次のことを試しました。

  1. 使用ImageView- を使用してImageView、円の画像を追加してみました。幅、高さを固定しました。pxdpなどの値を設定してみました。で利用可能なオプションinchesも試しました。また、同じ画像をフォルダに配置してみました。すべてのサイズのドローアブル フォルダーを作成しようとしました (例: drawable-mdpi、drawable-hdpi)。これ以外は、画像のスケーリングを停止しました。scallingImageViewdrawable-nodpi
  2. Canvas を使う- 上記の説明のとおり、Canvas を使って画像を描画してみました。図面の縮尺。
  3. 1 インチあたりのピクセル数の検索 .- プログラムで各電話の 1 インチあたりのピクセル数を見つけようとして、そこからロジックを開発して同じサイズで画像を動的に描画する方法を見つけられると考えました。Android デバイスの PPI の計算を含むいくつかのリンクを使用しました。それらのほとんどは、画面解像度の取得についてのみ話しています。

同じサイズの円を描くという要件を満たすにはどうすればよいですか? PPIを知っていればできるとしたら、どうすればいいですか?

4

2 に答える 2

1

前の答えは私にとってはうまくいきましたが、あなたにとってそうでない限り、私はそれが役立つと思う何かを説明しようとします.

密度が 1 (1 インチあたり 160 ピクセル) のデバイスがあり、ディスプレイ メトリックから、320 * 480 ピクセルであることがわかりました。簡単な計算で、モバイルの幅と高さをインチで知る必要があります。 = 幅 2 インチ、480/160 = 3 。今のところ、定規を手に入れて測定するまではすべて問題ありませんでしたが、驚きはこれでした:私は1.65 * 2.48インチを持っています!!.

次に、画面のインチあたりの物理ピクセルと呼ばれるものがあることに気付きました。これは私にとって安心であり、次のように取得できます。

getResources().getDisplayMetrics().xdpi;  //for width physical dpi
getResources().getDisplayMetrics().ydpi;  //for height physical dpi

これで、デバイスの物理的な幅と高さを次のように計算できます。

幅と高さの両方の物理 dpi は 193.5238 なので...

320 / 193.5238 = 幅 1.65 インチ 480 / 193.5238 = 高さ 2.48 インチ

そして、それは正しかった!!.

問題に戻り、任意の Phone のピクセル単位で 3cm を取得します。

幅を cm で取得:

幅 (cm) = 幅 (インチ) * 2.54 (1 インチは 2.54 cm に等しいため)

各 cm のピクセル数を取得する:

ピクセル単位の幅 / cm 単位の幅 = 幅の cm あたりのピクセル数 (px/cm)

3cmが必要な場合、それに応じたピクセルは次のとおりです。

3 * 数 = 3cm ピクセル

上記のすべては、次のように短縮できます。

float devicePixelsWidth = getResources().getDisplayMetrics().widthPixels;
float deviceActualDpi = getResources().getDisplayMetrics().xdpi ;
float deviceActualInchWidth = devicePixelsWidth / deviceActualDpi ;
float deviceActualCMWidth = deviceActualInchWidth * 2.54f ;

float PixelsForActual3CM = devicePixelsWidth / deviceActualCMWidth * 3;

最後に、上記のすべてが私によってテストおよび承認されており、以前の Answer メソッドと同じ精度を持っています:)

于 2016-05-18T14:03:45.203 に答える
0

多分これは答えではありませんが、役立つかもしれません

float _100MmAsPx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM,
    100/*mm unit set*/, getResources().getDisplayMetrics());

上記では、Nexus 5x では 1661.5354、Nexus 5 (エミュレーター) では 1889.7638 となります。どちらもフル HD ディスプレイですが、5 は 5.2 インチに対して 5 倍で 4.95 インチです。

これは、100 ミリメートルが 6 では 1662 ピクセル、5x では 1890 ピクセルであることを意味します。

于 2016-05-06T08:11:58.237 に答える