5

我正在使用 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

4 回答 4

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 ...
}

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

MyImageView miv;

miv = topView.findViewById("idforMyImageViewSetInLayoutXMLfile");

miv.drawSubBox(0,0, ...);
于 2013-03-12T17:20:15.630 回答
1

至于找出屏幕的像素尺寸,我认为您是正确的。heightPixels并将widthPixels为您提供您正在使用的屏幕的绝对像素尺寸。只是需要注意的一点-我担心使用 px 作为基本测量值,因为结果会根据屏幕的密度而变化。使用它似乎是一个更安全的想法,dp并且在找到屏幕中像素的绝对数量后,将该数字缩放,dpi以便矩形在每部手机上绘制相同。此外,绝对像素值并不代表实际可用空间,而只是像素总数。

Oherwise 我不知道这个布局是否完美地适合屏幕。x = 1205/30 = 40.166667. 将该号码插入(x-1)*30 = 1,175. 假设您手机上的 x 方向实际上包括 1205 像素(@JRowan - 它可能是横向),添加 30 像素似乎会使这些矩形适合屏幕。但是,这仅在任何矩形之间没有边界或偏移时才有效。使用您提供的数字,在 1205px 的屏幕宽度上只有 4.8px 的余地。在那个空间里有 40 个矩形,即使是一个很薄的边框也会把画从屏幕上推开。

于 2013-03-12T17:38:30.143 回答
1

我刚刚解决了这个问题,同时想知道利润率。

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

如果我删除标题栏,它会完美运行。

getWindow().requestFeature(Window.FEATURE_NO_TITLE);

我花了两天时间做这个正确的问题才找到答案。我在这里留下了我找到它的帖子的链接。

如何在 Android 应用程序中增加标题栏的大小?

Android中状态栏的高度

感谢您的回答。

于 2013-03-13T00:39:32.483 回答
-2

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

于 2014-08-29T15:42:06.347 回答