我使用的是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
上绘制我的图像时,它会部分地从屏幕上绘制出来。
我如何知道我的应用程序可以使用的屏幕部分?
我希望我能很好地解释我的问题。
非常感谢。
答案 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)
至于找出屏幕的像素尺寸,我认为你是对的。 heightPixels
和widthPixels
将为您提供正在使用的屏幕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)
如果网格在一个片段中,则问题是在片段视图膨胀之前获得可用的屏幕大小。在类似的场景中,我获取了托管活动中片段容器的宽度和高度,并将这些作为参数传递给带有网格的片段