Android 不同安卓设备的sceen大小的奇怪行为

Android 不同安卓设备的sceen大小的奇怪行为,android,view,compatibility,android-canvas,ondraw,Android,View,Compatibility,Android Canvas,Ondraw,我是一名大学生,正在做android开发的最后一个项目 我的项目是一个简单的snake游戏,用户可以使用加速计或按钮 我的游戏视图的工作方式是在我的“SnakeView”上动态创建一个网格,它扩展了视图,如下所示: /** * This is where we paint the grid and the game. */ @Override public void onDraw(Canvas canvas){ super.onDraw(canvas); if(created

我是一名大学生,正在做android开发的最后一个项目

我的项目是一个简单的snake游戏,用户可以使用加速计或按钮

我的游戏视图的工作方式是在我的“SnakeView”上动态创建一个网格,它扩展了视图,如下所示:

/**
 * This is where we paint the grid and the game.
 */
@Override
public void onDraw(Canvas canvas){
    super.onDraw(canvas);
    if(created){
    canvas.drawBitmap(mBitmap, 0, 0, mPaintScreen);
    mBitmap.eraseColor(Color.WHITE);
    for(int i = 0 ; i < xlength; i++){
        for(int j = 0; j < ylength; j++){
            int x = i * rectWidth;
            int y = j * rectHeight;
            Point p = new Point(i,j);
            if(snake.contains(p)){
                mBitmapCanvas.drawRect(x,y, x + rectWidth, y + rectHeight, mSnakePaint);
            }else if(walls.contains(p)){
                mBitmapCanvas.drawRect(x,y, x + rectWidth, y + rectHeight, mWallPaint);
            }else if (growBerries.contains(p)){
                mBitmapCanvas.drawRect(x,y, x + rectWidth, y + rectHeight, mGrowBerryPaint);
            }
        }
    }
    }
}
现在的问题是,块在不同设备之间的格式不正确。 我已经在Nexus7平板电脑(不确定尺寸,但要大得多)和我的pantech flex手机上测试过了。(大约4英寸)

如你所见,右边的那个,我创建的外部边框与屏幕宽度不匹配。 我想知道为什么会这样

我肯定知道边界紧靠着我的网格,只是网格没有展开以适应整个宽度

这应该是可行的,大小应该适合屏幕大小。我唯一的猜测是int w和int h是四舍五入的,它们并不代表实际的宽度和高度。 xlength和ylength是我想要在x和y方向上的块数


我注意到,如果我调整矩形的数量,它可能适合一台设备,但不适合另一台,我只希望它能完美地适合两台设备

如果更改矩形的大小,会发生什么情况?我的第一个猜测是,rectWidth不能被屏幕的宽度平均整除,这就是为什么在边框上有空白


如果是这种情况,那么您可能可以通过将rectWidth和rectHeight定义为屏幕尺寸的函数来修复它(尽管如果您不小心,这可能意味着不同的设备有不同大小的播放区域。我不确定您是否希望避免这种情况)。

从哪里获得所有尺寸?(xlength、ylength等)xlength和ylength是我想要的网格上的方块数。它们是从我的主要活动中发送的。我怀疑你得到了尺寸,并以某种方式错误地执行了计算。要使用它,您需要显示这段代码,或者更好:首先绘制没有这些矩形的屏幕,然后查看错误开始出现在计算的哪个部分。我在编辑中显示了包含计算的代码。这是在我的onSizeChanged方法中。请参阅我的编辑,我忘记提到rectWidth和height是根据实际屏幕宽度确定的。如何定义墙?您的问题可能是未正确定义以包括屏幕边框。walls是点的链接列表。它打开XML文件中的数据。但它是设置的,因此墙位于尺寸标注的边界上。我现在把xlength设置为35,我把墙的位置设置为(34,y)我们把网格从x=0到34,我很确定墙并不是问题所在,它们肯定是包围了网格的边界,这是网格没有适当伸展以适应宽度的问题。这可能不会改变任何事情,但是在
onSizeChanged
中,参数w和h不是视图的新宽度和高度吗?如果他们已经给你了,为什么你需要在这个方法中调用
getWidth()
getHeight()
?那不会把事情搞砸吧
getWidth()
由于某种神秘的原因,不能给你一个与w不同的值,是吗?是的,我修正了它,所以我现在将mbitmap设置为w和h。没有区别。我想知道这个问题是否能解决。
@Override
public void onSizeChanged(int w, int h, int oldW, int oldH){
    mBitmap = Bitmap.createBitmap(getWidth(), getHeight(),Bitmap.Config.ARGB_8888);
    mBitmapCanvas = new Canvas(mBitmap);
    mBitmap.eraseColor(Color.WHITE);
    width = w;
    height = h;
    rectWidth = width / (xlength-1);
    rectHeight = height / (ylength-1);
    invalidate();
}