タッチイベントとビュー測定/レイアウトで使用される単位で、プログラムで画面サイズを確認するにはどうすればよいですか?言い換えれば、私はタッチイベントで使用される座標系では、画面の右下隅の座標をしたい
getRawX()/getRawY()とView.getLocationOnScreen()。
私の携帯電話にはさまざまなモードの「ピクセル」の概念がいくつかあり、それらが一貫したストーリーになっていないため、目的のイベント/ビューユニットを「ピクセル」と呼ぶのをためらっています。
私はこれがstackoverflowや他の場所で多く尋ねられて答えられているのを見ますが、答えはどれも実際に私の携帯電話(droid 4、android 4.1.2)ですべてのモードで機能しません:
- Androidアプリでプログラムによって画面の幅を確認できますか?
- AndroidでScreenSizeをプログラムで取得する方法
- Androidは、画面サイズに基づいてプログラムでビューの可視性を設定します
- Androidで画面の高さを取得するにはどうすればよいですか?
- Androidで画面の高さを取得する
- https://groups.google.com/forum/#!topic/android-developers/IpxnfvDFrpc
- http://shuklaxyz.blogspot.com/2012/02/how-to-programmatically-figure-out.html
- http://coderock.net/how-to-determine-screen-resolution-programmatically/
- http://www.codeproject.com/Tips/313848/Get-actual-screen-size-for-the-application-layout
- Androidおよびdp単位でプログラム的に幅と高さを設定する
- http://www.simplecodestuffs.com/how-to-get-screen-dimensions-programmatically-in-android/
- http://www.androidsnippets.com/get-size-and-orientation-of-the-screen
- http://grokbase.com/t/gg/android-developers/127aatfqb6/how-to-determine-screen-resolution-programmatically
(ワオ!)
これは、アプリが「画面互換モード」(つまり、マニフェストでtargetSdkVersion <= 10)であるかどうかに関係なく機能する必要があるライブラリコード用であり、位置、サイズについても想定しません。 、またはステータスバーまたはその他の同様の画面装飾の存在。
事実は次のとおりです。
私の電話(android 4.1.2を実行しているdroid 4)には、540x960の物理ピクセルがあります。
タッチイベントの表示と測定値の表示から求められる単位での画面のサイズは、アプリが画面互換モードの場合は360x640、画面互換モードでない場合は540x960です。これらは私がプログラムで見つける必要のある数値であり、それらを見つけるためにタッチイベントやビューを操作する必要はありませんが、これらの数値を返すAPIを見つけるのは非常に困難です。
さまざまな方法で取得されたDisplayオブジェクトとDisplayMetricsオブジェクトはすべて、画面サイズが540x960 "ピクセル"(画面互換モードかどうかに関係なく)であると主張しています。具体的には、次の例では常に540x960と表示されます:DisplayMetrics。{width、height} Pixels、Display.getSize()、Display.getRealSize()、Display.get {Width、Height}()、
さまざまな方法で取得された構成オブジェクトは、すべてscreen {Width、Height} Dp = 360x614(画面互換モードかどうかに関係なく)と言います。アスペクト比が間違っているので、画面全体を表すとは思いません。(それは画面全体からステータスバーを引いたものだと思います。画面全体が必要です。)画面全体が360x640 dpであると言っても安全ですが、640を返すAPIはわかりません。
さまざまな方法で取得されたDisplayMetricsは、「密度」が画面互換モードの場合は1.0f、画面非互換モードの場合は1.5fであると言います。
アクティビティ
getWindow().getAttributes().{width,height}は通常MATCH_PARENT実際のサイズではなく含まれているため、役に立ちません。しかし、私は明らかにアクティビティから望ましい答えを得ることができますgetWindow().getDecorView().getMeasured{Width,Height}()(アクティビティのウィンドウのdecorViewが画面全体を占めているように見えないため、これは実際には意外です。それは、画面からステータスバーを引いたように見えます)。しかし、これに依存したくないのは、ウィンドウのサイズが変更された場合(ソフトキーボードが表示された場合、誰かがwindow.setAttributes()を呼び出した場合、またはアクティビティにまったく参加していない場合)、これが明らかにすべてになるためです。違う。
ピクセル= dp *密度画面互換モードでない場合、報告されたすべての数値(上記の(3)、(4)、(5))と一致するようです:540x960 = 360x640 * 1.5しかし、画面互換性モードでは加算されません:540x960!= 360x640 * 1したがって、何かがおかしいです。
最も簡単な説明は、上記の(3)にリストされているメソッドは、画面互換モードのときに「ピクセル」に対して間違った答えを返すだけだと思います。つまり、360x640の「ピクセル」を返すように意図されていましたが、間違っています代わりに540x960を返します。しかし、それを見る他の方法があるかもしれません。
いずれにせよ、上記のパズルのピースから、モードに関係なく必要な数を取得することは、確かにトリッキーなパズルです。私は両方のモードで私の電話で動作するように見える方法を見つけましたが、それは非常に遠回りであり、それはまだかなり不安定であるように見える2つの仮定に依存しています(以下のコードコメントで説明)。
これが私のレシピです:
/** get screen size in "pixels", i.e. touchevent/view units.
* on my droid 4, this is 360x640 or 540x960
* depending on whether the app is in screen compatibility mode
* (i.e. targetSdkVersion<=10 in the manifest) or not. */
public void getScreenSizePixels(int widthHeightInPixels[/*2*/])
{
Resources resources = getResources();
Configuration config = resources.getConfiguration();
DisplayMetrics dm = resources.getDisplayMetrics();
// Note, screenHeightDp isn't reliable
// (it seems to be too small by the height of the status bar),
// but we assume screenWidthDp is reliable.
// Note also, dm.widthPixels,dm.heightPixels aren't reliably pixels
// (they get confused when in screen compatibility mode, it seems),
// but we assume their ratio is correct.
double screenWidthInPixels = (double)config.screenWidthDp * dm.density;
double screenHeightInPixels = screenWidthInPixels * dm.heightPixels / dm.widthPixels;
widthHeightInPixels[0] = (int)(screenWidthInPixels + .5);
widthHeightInPixels[1] = (int)(screenHeightInPixels + .5);
}
画面のサイズを見つけるためのより良い/よりきれいな方法はありますか?