针对不同Android设备的屏幕尺寸的奇怪行为

时间:2012-11-28 22:53:03

标签: android view compatibility android-canvas ondraw

我是一名大学生,致力于Android开发的最终项目。

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

我的游戏视图的工作方式是我在我的“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);
            }
        }
    }
    }
}

基本上我有一个包含蛇和我的浆果的arraylist。 如果平原上的点在任何一个arraylist中,我会将矩形绘制成不同的颜色。否则我把飞机保持白色。

要设置rectWidth和height,请进入onSizeChanged方法。

@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();
}

现在问题是块不会在不同设备上格式化为正确的大小。 我已经在nexus 7平板电脑上测试了这个(不确定尺寸,但它的尺寸要大得多),而我的手机是pantech flex。 (大约4英寸)

myimage http://i45.tinypic.com/34r7lsy.png myimage2 http://i46.tinypic.com/fl98hi.png

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

我当然知道边框正在拥抱我的网格,只是网格没有展开以适应整个宽度。

这应该有用,尺寸应根据屏幕尺寸调整。我唯一的猜测是int w和int h被舍入,并且它们不会保证实际的宽度和高度。 xlength和ylength是我想要的x和y方向的块数。

我注意到如果我调整矩形的数量,它可能适合一个设备,而不是另一个设备,我只是希望它完全适合两者!

1 个答案:

答案 0 :(得分:2)

如果更改矩形的尺寸会发生什么?我的第一个猜测是rectWidth不能被屏幕的宽度整除,这就是边界有空白的原因。

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