可用屏幕的大小

时间:2013-03-12 16:25:16

标签: android

我使用的是Nexus 7 1280x800 android 4.2.2 API 17

我希望获得屏幕的大小,将其划分为相同高度和宽度的方形区域。

我正在使用FrameLayout,我的方块是ImageView的子类。

我这样做

context.getResources().getDisplayMetrics().heightPixels; ----> 1205 context.getResources().getDisplayMetrics().widthPixels; ------> 800

我认为1205不是1280,因为屏幕顶部和底部有两个Android菜单。

我的每个方块都是30x30像素。

要知道我可以绘制多少个正方形作为最大值:

int x=1205/30;

当我尝试在坐标(x-1)*30 ,y上绘制我的图像时,它会部分地从屏幕上绘制出来。

我如何知道我的应用程序可以使用的屏幕部分?

我希望我能很好地解释我的问题。

非常感谢。

4 个答案:

答案 0 :(得分:3)

如果所有方块都在同​​一个ImageView中,那么我猜最简单的方法是创建自己的imageView:

class MyImageView extends ImageView {
    Context context;
    int myWidth = 0;
    int myHeigh = 0;
    int numBoxesX = 0;
    int numBoxesY = 0;

    private final int boxWidth  = 30;
    private final int boxHeight = 30;

    ImageView(Context c) {
        super(c);
        context = c;
    }
}

在类中,您覆盖onSizeChange函数

@Override
protected void onSizeChanged (int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    myWidth  = w;
    myHeight = h;
    // Set up other things that you work out from the width and height here, such as

    numBoxesX = myWidth / boxWidth;
    numBoxesY = myHeight / boxHeight;
}

然后创建一个绘制框的函数:

public void drawSubBox(int x, int y, ...) {
    // Fail silently if the box being drawn doesn't exist ...
    if ((x<0) || (x>=numBoxesX)) return;
    if ((y<0) || (y>=numBoxesY)) return;

    // Your code to draw the box on the screen ...
}

创建此视图后,您可以将其添加到布局中,并像访问任何其他视图一样访问它的功能,包括您添加的任何视图以定义子框的大小等等。所以在类中为具有此布局的活动

MyImageView miv;

miv = topView.findViewById("idforMyImageViewSetInLayoutXMLfile");

miv.drawSubBox(0,0, ...);

答案 1 :(得分:1)

至于找出屏幕的像素尺寸,我认为你是对的。 heightPixelswidthPixels将为您提供正在使用的屏幕absolute pixel dimensions。只是要注意的事情 - 我担心使用px作为基础测量,因为结果会改变depending on the density of the screen。使用dp并在找到屏幕中的绝对像素数后,使用dpi来查看该数字,以便矩形在每部手机上绘制相同的数字,这似乎是一个更安全的想法。绝对像素值也不代表实际的自由空间,只是像素的总数。

另外我不知道这个布局能够完美地适应屏幕。 x = 1205/30 = 40.166667。在(x-1)*30 = 1,175中插入该号码。假设手机上的x方向确实包含1205px(@JRowan - 它可能是风景),添加30px似乎会使这些矩形适合屏幕。但是,这仅在任何矩形之间没有边界或偏移时才有效。使用您提供的数字,在屏幕的1205px宽度上只有4.8px的余地。在该空间中有40个矩形,即使是薄的边界也会将绘图推离屏幕。

答案 2 :(得分:1)

我在解决利润时解决了这个问题。

键是标题栏,它实际上是应用程序屏幕的一部分,但在绘图屏幕之外。

如果删除标题栏,它可以完美运行。

getWindow().requestFeature(Window.FEATURE_NO_TITLE);

我花了两天的时间来找到答案,刚刚做了正确的问题。我留下链接到我发现它的帖子。

How to increase the size of the title bar in an Android application?

Height of status bar in Android

感谢您的回答。

答案 3 :(得分:-2)

如果网格在一个片段中,则问题是在片段视图膨胀之前获得可用的屏幕大小。在类似的场景中,我获取了托管活动中片段容器的宽度和高度,并将这些作为参数传递给带有网格的片段