如何在gridview位置设置随机画布对象?

时间:2020-10-03 13:52:32

标签: java android-studio canvas gridview android-adapter

我正在尝试使用3个画布对象(drawCircle,drawOval,drawRect)在gridview位置进行设置,以制作珠宝游戏。我已经使用Random.nextInt(bound:3)获得了随机位置,但是对如何设置画布对象的位置感到困惑。我有一个画布类MyCanvas和一个CanvasAdapter类用于网格数据。我的想法是,我在canvas类中创建一个方法,该方法在切换案例中设置一个随机数,然后绘制所需的对象。

  public void randShapes()
    {
        switch(randInt.nextInt(3))
        {
            case 0: pixelPaint.setColor(Color.RED);
                pixelPaint.setStrokeWidth(60);
                myCanvas.drawCircle(0, 0, 1, pixelPaint); return;
            case 1: pixelPaint.setColor(Color.GREEN);
                myCanvas.drawRect(0.5f,0.5f,
                        0.5f, 0.5f, pixelPaint); return;
            case 2: pixelPaint.setColor(Color.BLUE);
                myCanvas.drawRect(0.75f,0.75f,
                        0.5f, 0.5f, pixelPaint); return;
        }
    }  

    @Override
    protected void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);

        int w = myBitmap.getWidth();
        int h = myBitmap.getHeight();

        randShapes();
    ...
    }

然后在我的CanvasAdapter中获取数组中的位置,并将它们引用回到canvas类中

//CanvasAdapter.java

// Keep all canvas objects in array
    public Integer[] mThumbIds = {
            randInt.nextInt(3), randInt.nextInt(3),
            randInt.nextInt(3), randInt.nextInt(3),
            randInt.nextInt(3), randInt.nextInt(3),
            randInt.nextInt(3), randInt.nextInt(3),
            randInt.nextInt(3), randInt.nextInt(3),
            randInt.nextInt(3), randInt.nextInt(3),
            randInt.nextInt(3), randInt.nextInt(3),
            randInt.nextInt(3), randInt.nextInt(3),
    };

//Back to Canvas.java
    int[] shapePosition = CanvasApdapter.mThumbsIds

    public void randShapes()
    {
        for(int i = 0; i < shapePosition.length; i++){
        switch(randInt.nextInt(3))
        {
            case 0: pixelPaint.setColor(Color.RED);
                pixelPaint.setStrokeWidth(60);
                myCanvas.drawCircle(shapePosition.length[i] + 0,shapePosition.length[i] + 0,shapePosition.length[i] + 1, pixelPaint); return;
            case 1: pixelPaint.setColor(Color.GREEN);
                myCanvas.drawRect(shapePosition.length[i] + 0.5f,shapePosition.length[i] + 0.5f,
                        shapePosition.length[i] + 0.5f, shapePosition.length[i] + 0.5f, pixelPaint); return;
            case 2: pixelPaint.setColor(Color.BLUE);
                myCanvas.drawRect(shapePosition.length[i] + 0.75f,shapePosition.length[i] + 0.75f,
                        shapePosition.length[i] + 0.5f, shapePosition.length[i] + 0.5f, pixelPaint); return;
        }
        }
    }  

我不确定我是否遵循正确的逻辑。我习惯于统一和C#/ C ++编程,而android studio使其难以遵循。我已尝试按照本教程进行操作 https://www.tutorialspoint.com/android/android_grid_view.htm谢谢大家的帮助。

1 个答案:

答案 0 :(得分:0)

对于要创建的游戏,您已经定义了形状的网格(数组)。网格中的每个元素都是随机形状。绘制网格时,只需遍历网格的行和列并根据数组值绘制形状即可。

此代码应提供基本概念:

//CanvasAdapter.java

// Keep all canvas objects in 2D array, 2 columns, 8 rows
    public Integer[][] mThumbIds = {   // random values
            { randInt.nextInt(3), randInt.nextInt(3) },
            { randInt.nextInt(3), randInt.nextInt(3) },
            { randInt.nextInt(3), randInt.nextInt(3) },
            { randInt.nextInt(3), randInt.nextInt(3) },
            { randInt.nextInt(3), randInt.nextInt(3) },
            { randInt.nextInt(3), randInt.nextInt(3) },
            { randInt.nextInt(3), randInt.nextInt(3) },
            { randInt.nextInt(3), randInt.nextInt(3) }
    };

//Back to Canvas.java
    int[][] shapePosition = CanvasApdapter.mThumbsIds
    int shapeheight = 1
    int shapewidth = 1

    public void drawShapes()  // fill in grid
    {
        for(int row = 0; row < shapePosition.length; row++){
            for(int col = 0; col < shapePosition[row].length; col++){
                switch(shapePosition[row][col])
                {
                    case 0: pixelPaint.setColor(Color.RED);
                        pixelPaint.setStrokeWidth(60);
                        myCanvas.drawCircle(row*shapeheight + 0.5f, col*shapewidth + 0, 0.5f, pixelPaint);
                    case 1: pixelPaint.setColor(Color.GREEN);
                        myCanvas.drawRect(row*shapeheight + 0.1f,col*shapewidth + 0.1f, row*shapeheight + 0.9f, col*shapewidth + 0.9f, pixelPaint);
                    case 2: pixelPaint.setColor(Color.BLUE);
                        myCanvas.drawRect(row*shapeheight + 0.1f,col*shapewidth + 0.1f, row*shapeheight + 0.9f, col*shapewidth + 0.9f, pixelPaint);
                }
           }
       }
    } 
    
    /// draw event, redraw grid
    protected void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);

        int w = myBitmap.getWidth();
        int h = myBitmap.getHeight();

        drawShapes();
    ...
    }