如何在Android中找到可用的显示分辨率?

时间:2012-09-07 02:50:19

标签: android android-layout screen-resolution

假设我们有一个Android应用程序想要完全管理显示区域,因此它可以调整其子控件的大小(在运行时,没有XML - 我们需要动态地主动修改子控件大小)。

此应用程序仅以横向方式运行且无键盘输入,因此我们不希望可用区域发生变化。

我们将显示的尺寸将根据此可用区域计算。例如,一个项目恰好占据可用区域的左半部分,右半部分将以严格的比例划分其他项目。甚至会调整字体大小,使它们正确地适合项目。

我最初的想法是为main.xml提供除了没有内容但配置为扩展到最大大小(使用fill_parent或类似内容)的网格布局。我们将使用网格布局来定位事物,但是我们对大小的控制将决定布局管理器如何显示事物。

希望我们可以在适当的时间(在初始化之后,在绘制之前)查询网格布局以获得分辨率,然后根据它调整所有未来的绘制。

有更好的方法吗?我意识到XML旨在将内容与表示分开,但是这个特定的客户端需要完全控制布局,并且必要时会限制代码可以运行的设备(它是内部应用程序,因此他们可以指示)。 / p>

另一个想法是在XML中添加伪造大小的所有子控件(一切都将在那里,它只是可能改变的大小)。但是,通过这样做,我不确定我是否会失去获得可用区域的能力,从而智能地调整大小。

1 个答案:

答案 0 :(得分:3)

您是否在resolutiondensity之间混淆了。什么是“可用的显示分辨率”?每个设备只有一个像素分辨率:

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);

final int height = dm.heightPixels;
final int width = dm.widthPixels;

但您显示的内容取决于您受密度和显示尺寸影响的分辨率。

<强>(修订版)

(1)以全屏模式开始并隐藏所有标题栏或通知栏:

    // Remove title bar
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    // Remove notification bar
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);

(2)获取视图Rect:

    Rect rect = new Rect();
    Window window = getWindow();
    window.getDecorView().getWindowVisibleDisplayFrame(rect);
    int statusBarHeight = rect.top;
    int contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
    int titleBarHeight = contentViewTop - statusBarHeight;