터치 이벤트 및 뷰 측정 / 레이아웃에 사용되는 단위에서 프로그래밍 방식으로 화면 크기를 어떻게 알 수 있습니까? 즉, 터치 이벤트 ' getRawX()/getRawY()및에 의해 사용되는 좌표계에서 화면 오른쪽 하단 모서리의 좌표를 원합니다
View.getLocationOnScreen().
다양한 모드의 전화기에 여러 가지 "픽셀"개념이 있기 때문에 원하는 이벤트 / 뷰 단위를 "픽셀"이라고 부르는 것이 주저하며 일관된 이야기를 추가하지는 않습니다.
나는 이것이 stackoverflow 및 다른 곳에서 많이 요청되고 답변 된 것을 보았지만 아무것도 없었다. 모든 모드에서 내 전화 (droid 4, android 4.1.2)에서 실제로 응답하는 것은 .
- 안드로이드 앱에서 화면 너비를 프로그래밍 방식으로 찾을 수 있습니까?
- 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
- dp 단위로 프로그래밍 방식으로 Android 및 너비 및 높이 설정
- 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 "픽셀"이라고 주장합니다 (화면 호환성 모드에 관계없이). 구체적으로 말하면, DisplayMetrics. {width, height} 픽셀, Display.getSize (), Display.getRealSize (), Display.get {Width, Height} (),
다양한 방법으로 얻은 구성 객체는 모두 screen {Width, Height} Dp = 360x614 (화면 compat 모드인지 여부)를 말합니다. 가로 세로 비율이 잘못 되었기 때문에 전체 화면을 나타내는 것은 아닙니다. (전체 화면에서 상태 표시 줄을 뺀 것으로 생각합니다. 전체 화면이 필요합니다.) 640을 반환하는 API를 모르더라도 전체 화면이 360x640dp라고 말하는 것이 안전하다고 생각합니다.
다양한 방법으로 얻은 DisplayMetrics는 화면 밀도 모드에서는 "밀도"가 1.0f이고, 화면 모드에서는 그렇지 않은 경우 1.5f입니다.
액티비티
getWindow().getAttributes().{width,height}는 일반적으로MATCH_PARENT실제 크기 가 아니라 포함되므로 도움이되지 않습니다 . 그러나 나는 분명히에서 원하는 답변을 얻을 수있는 활동의getWindow().getDecorView().getMeasured{Width,Height}()(실제로 활동의 창의 decorView하지 않기 때문에 놀라운 보고 가 전체 화면을 차지 것처럼, 그것은 화면을 뺀 상태 표시 줄을 복용 것 같습니다). 그러나 창 크기가 조정되면 (소프트 키보드가 나타납니다. 누군가 window.setAttributes ()를 호출하거나 누군가가 활동에 있지 않은 경우), 이것은 분명히 모든 것이 될 것이기 때문에 이것에 의존하고 싶지 않습니다. 잘못된.
다음 공식을 유지해야한다는 것을 이해합니다 .pixels = dp * density 그렇지 않은 경우보고 된 모든 숫자 ((3), (4), (5))와 일치하는 것 같습니다 화면 호환성 모드 : 540x960 = 360x640 * 1.5 그러나 화면 호환성 모드에서는 합산되지 않습니다. 540x960! = 360x640 * 1 따라서 무언가가 잘못되었습니다.
가장 간단한 설명은 위의 (3)에 나열된 방법이 화면 호환 모드에서 "픽셀"에 대한 잘못된 답변을 제공한다는 것입니다. 즉, 360x640 "픽셀"을 반환하려고했지만 잘못되었습니다. 대신 540x960을 반환합니다. 그러나 다른 방법으로 볼 수도 있습니다.
어쨌든, 위의 퍼즐 조각에서 모드에 관계없이 원하는 숫자를 얻는 것은 확실히 까다로운 퍼즐입니다. 두 가지 모드 모두에서 휴대 전화에서 작동하는 것처럼 보이는 방법을 찾았지만 매우 회로가 뛰어나고 여전히 다소 흔들리는 것처럼 보이는 두 가지 가정에 의존합니다 (아래 코드 주석에 설명).
여기 내 레시피가 있습니다 :
/** 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);
}
화면 크기를 찾는 더 나은 / 깨끗한 방법이 있습니까 ??