繁体   English   中英

Android / Java-放大我绘制的画布

[英]Android/ Java - Zooming in on my drawn canvas

我创建了一个2D迷宫,它由2组布尔数组组成,并指向迷宫的垂直壁和水平壁。 该迷宫当前为12 x 12,但是我只想显示5 x 5。

有没有一种方法可以将迷宫缩放到用户所在位置的5 x 5周长,然后每次移动时仅显示下一个块,因此只能显示5 x 5。

理想情况下,我想坚持将整个内容绘制出来,然后简单地进行某种鸟瞰缩放(这将提高可用性并总体上加快应用程序的速度)。

编辑下面是我目前用来绘制迷宫的代码。 但是,当我移动用户圈时,以下代码似乎未绘制正确的v和hLines。

public void onDraw(Canvas canvas) 
{
    canvas.drawRect(0, 0, width, height, background);
    mazeSizeX = 5 + maze.getCurrentX();
    mazeSizeY = 5 + maze.getCurrentY();
    for(int i = maze.getCurrentX(); i < mazeSizeX; i++) 
    {
        for(int j = maze.getCurrentY(); j < mazeSizeY; j++){
            float x = j * totalCellWidth;
            float y = i * totalCellHeight;
            if(j < mazeSizeX -1 && vLines[i][j]) {
                //we'll draw a vertical line
                canvas.drawLine(x + cellWidth,   //start X
                                y,               //start Y
                                x + cellWidth,   //stop X
                                y + cellHeight,  //stop Y
                                line);
            }
            if(i < mazeSizeY -1 && hLines[i][j]) {
            //we'll draw a horizontal line
                canvas.drawLine(x,               //startX 
                                y + cellHeight,  //startY 
                                x + cellWidth,   //stopX 
                                y + cellHeight,  //stopY 
                                line);
            }
        }
    }
}

注意-mazeSizeX和Y最初设置为5。关于我要去哪里的任何进一步指导,将不胜感激。

编辑2:请参见下图以指示用户可能采取的3个不同步骤来帮助进一步解释我遇到的问题。 第一个图像是起点,并已按其原样绘制,但是当我开始移动时,围绕线条的用户圆无法正确绘制。

3个不同的用户位置,显示drawLine问题

最后,请参见下面我正在使用的当前布尔数组以绘制位智墙:

boolean[][] vLines = new boolean[][]{
                        {true ,false,false,false,true ,false,false},
                        {true ,false,false,true ,false,true ,true },
                        {false,true ,false,false,true ,false,false},
                        {false,true ,true ,false,false,false,true },
                        {true ,false,false,false,true ,true ,false},
                        {false,true ,false,false,true ,false,false},
                        {false,true ,true ,true ,true ,true ,false},
                        {false,false,false,true ,false,false,false}
                     };
boolean[][] hLines = new boolean[][]{
                        {false,false,true ,true ,false,false,true ,false},
                        {false,false,true ,true ,false,true ,false,false},
                        {true ,true ,false,true ,true ,false,true ,true },
                        {false,false,true ,false,true ,true ,false,false},
                        {false,true ,true ,true ,true ,false,true ,true },
                        {true ,false,false,true ,false,false,true ,false},
                        {false,true ,false,false,false,true ,false,true }
                    };

提前致谢

我将使用两个变量: scroll_xscroll_y ,它们在绘制时使用,在移动时进行修改,这样迷宫总是以5 x 5的比例绘制,并且您可以使用这两个变量来确定应绘制地图哪个部分的偏移量。

另外,您可以根据需要实现zoom_xzoom_y变量来更改缩放zoom_y

由于您使用的是onDraw方法,因此排除了我可以想到的“将所有内容绘制一次并移动地图”的所有可能性。

根据您对问题的描述,这是我目前可以提供的最佳答案。

编辑:

现在,您已提供了更多信息,这是为您重新设计的onDraw:

在下面的函数中,如果迷宫大于5 x 5,我将使用maze.scrollXmaze.scrollY作为滚动偏移量。我还添加了drawSize属性来定义要绘制的大小。是。 如果您在地图的左上角,则应将两者都设置为零。 我尚未亲自测试此代码,因此请告知我它的工作原理。

请注意,此代码没有错误检查,如果maze.scrollX太大,则会导致错误。

public void onDraw(Canvas canvas) 
{
    canvas.drawRect(0, 0, width, height, background);
    int drawSizeX = 5;
    int drawSizeY = 5;
    for(int i = 0; i < drawSizeX - 1; i++) 
    {
        for(int j = 0; j < drawSizeY - 1; j++){
            float x = j * totalCellWidth;
            float y = i * totalCellHeight;
            if(vLines[i + maze.scrollX][j + maze.scrollY]) {
                //we'll draw a vertical line
                canvas.drawLine(x + cellWidth,   //start X
                                y,               //start Y
                                x + cellWidth,   //stop X
                                y + cellHeight,  //stop Y
                                line);
            }
            if(hLines[i + maze.scrollX][j + maze.scrollY]) {
            //we'll draw a horizontal line
                canvas.drawLine(x,               //startX 
                                y + cellHeight,  //startY 
                                x + cellWidth,   //stopX 
                                y + cellHeight,  //stopY 
                                line);
            }
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM