如何以触摸事件和查看测量/布局使用的单位以编程方式查找屏幕尺寸?换句话说,我想在屏幕的右下角的坐标,通过触摸事件所使用的坐标系中
getRawX()/getRawY()和View.getLocationOnScreen().
我不愿意将所需的事件/视图单位称为"像素",因为在我的手机上有各种模式的"像素"概念,并且它们并没有达到一致的故事.
我看到这已经被问到并在stackoverflow和其他地方得到了很多回答,但在所有模式下,我的手机(droid 4,android 4.1.2)上没有任何答案实际可行:
(哇!)
这适用于需要工作的库代码,无论应用程序是否处于"屏幕兼容模式"(即清单中的targetSdkVersion <= 10),我也不想对位置,大小做任何假设,或存在状态栏或任何其他类似的屏幕装饰.
以下是事实:
我的手机(机器人4运行Android 4.1.2)有540x960物理像素,即小彩色发光点.
当应用程序处于屏幕比较模式时,所需单位的屏幕大小(从查看触摸事件和查看测量值)为360x640,当应用程序未处于屏幕比较模式时为540x960.这些是我需要以编程方式找到的数字,而不是用触摸事件或视图来查找它们,但是我很难找到任何会返回这些数字的API.
以各种方式获得的显示和DisplayMetrics对象均声称屏幕尺寸为540x960"像素"(无论是否在屏幕比较模式下).具体来说,以下都是540x960:DisplayMetrics.{width,height} Pixels,Display.getSize(),Display.getRealSize(),Display.get {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()?或者我可能根本不在Activity中),这显然是全部错误.
我理解以下公式应该保持: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 …Run Code Online (Sandbox Code Playgroud) 有没有办法以编程方式查找应用程序安装的设备是7英寸平板电脑还是10英寸平板电脑?
DisplayMetrics metrics = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;
Run Code Online (Sandbox Code Playgroud)
我使用这些代码来获取屏幕的高度和宽度
我的Nexus7的屏幕高度应为1280
但它返回1205 ...
我的minSdkVersion是8级
所以我不能使用这些方法:
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int screen_width = size.x;
int screen_height = size.y;
Run Code Online (Sandbox Code Playgroud)
现在,我应该如何获得正确的屏幕尺寸?
编辑:
if (Build.VERSION.SDK_INT >= 11) {
Point size = new Point();
try {
this.getWindowManager().getDefaultDisplay().getRealSize(size);
screenWidth = size.x;
screenHeight = size.y;
} catch (NoSuchMethodError e) {
Log.i("error", "it can't work");
}
} else {
DisplayMetrics metrics = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
screenWidth = metrics.widthPixels;
screenHeight …Run Code Online (Sandbox Code Playgroud)