如何以触摸事件和查看测量/布局所使用的单位以编程方式找出屏幕尺寸?换句话说,我想要屏幕右下角的坐标,在触摸事件' getRawX()/getRawY()和所使用的坐标系中
View.getLocationOnScreen()。
我不愿意将所需的事件/视图单位称为“像素”,因为我的手机在各种模式下显然都存在“像素”的几种概念,而且它们并没有形成一致的故事。
我认为这已被要求,并回答了很多计算器和其他地方,但没有答案我的手机上实际工作(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对象都声称屏幕尺寸为540 x 960“像素”(无论是否在屏幕兼容模式下)。具体而言,以下所有内容始终都是540x960:DisplayMetrics。{width,height}像素,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。但是,也许还有其他的观察方法。
无论如何,从上面的拼图中获得与模式无关的期望数字无疑是一个棘手的难题。我发现一种在两种模式下都可以在我的手机上运行的方法,但是它非常circuit回,它依赖于两个看起来仍然有些不稳定的假设(如下面的代码注释中所述)。
这是我的食谱:
/** 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);
}
有没有更好/更清洁的方法来查找屏幕尺寸?