簡體   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