【问题标题】:draw background (checkerboard) java android绘制背景(棋盘)java android
【发布时间】:2011-10-26 14:50:44
【问题描述】:

我对 java 和 android 还很陌生,但我正在寻找一个能走上正轨的好教程。我想编写一个函数,在我的应用程序当前视图的背景上绘制/重绘黑白棋盘图案。我不想使用实际图像,因为我希望能够在调整大小事件等时重绘背景。我想动态改变正方形的大小..

感谢您的帮助

【问题讨论】:

    标签: java android colors background


    【解决方案1】:

    最有效的方法是使用包含棋盘图案(例如 2x2 正方形)的位图,并使用带有 REPEAT 平铺模式的 BitmapShader:

    BitmapShader shader = new BitmapShader(bitmapTemplate, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
    Paint paint = new Paint();
    paint.setShader(shader);
    
    // in your draw method
    
    canvas.drawRect(x, y, width, height, paint);
    

    【讨论】:

    • 只是一个包含棋盘图案的位图。
    • @RomainGuy 我正在制作一个游戏,我想在其中移动这样的平铺位图。所以xy 正在改变。它看起来很奇怪,背景没有随着矩形移动,它只是停留。如何解决这个问题?
    • 您可以在 BitmapShader 上设置一个本地矩阵,也可以使用循环调用 drawBitmap() 自己绘制图块。
    • @RomainGuy 谢谢。或许你也会知道这个问题的答案,请看:stackoverflow.com/questions/15345444/…
    【解决方案2】:

    我需要这个并且需要它比提供我自己的位图资源更灵活一点。所以这是一个即时选项。

    在您的 onCreate() 或构造函数方法中调用此方法并保存绘制。然后只需在 onDraw() 中的填充操作期间使用绘画。

    private Paint createCheckerBoard(int pixelSize)
    {
        Bitmap bitmap = Bitmap.createBitmap(pixelSize * 2, pixelSize * 2, Bitmap.Config.ARGB_8888);
    
        Paint fill = new Paint(Paint.ANTI_ALIAS_FLAG);
        fill.setStyle(Paint.Style.FILL);
        fill.setColor(0x22000000);
    
        Canvas canvas = new Canvas(bitmap);
        Rect rect = new Rect(0, 0, pixelSize, pixelSize);
        canvas.drawRect(rect, fill);
        rect.offset(pixelSize, pixelSize);
        canvas.drawRect(rect, fill);
    
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setShader(new BitmapShader(bitmap, BitmapShader.TileMode.REPEAT, BitmapShader.TileMode.REPEAT));
        return paint;
    }
    

    【讨论】:

      【解决方案3】:

      我已经制作了一个自定义的Drawable,它可以绘制背景棋盘格,请参阅这个 github repo - CheckerboardDrawable

      你可以这样使用它:

      yourView.setBackgroundDrawable(CheckerboardDrawable.create());
      

      而且它是可定制的:

      CheckerboardDrawable drawable = new CheckerboardDrawable.Builder()
              .colorOdd(Color.LTGRAY)
              .colorEven(Color.DKGRAY)
              .size(20)
              .build();
      yourView.setBackgroundDrawable(drawable);
      

      输出将是:

      希望对你有帮助。

      【讨论】:

        【解决方案4】:

        Kotlin,基于上面的 Simon 回答,

        fun createCheckerBoard(tileSize: Int) = Paint(Paint.ANTI_ALIAS_FLAG).apply {
            shader = BitmapShader(Bitmap.createBitmap(tileSize * 2, tileSize * 2, Bitmap.Config.ARGB_8888).apply {
                Canvas(this).apply {
                    val fill = Paint(Paint.ANTI_ALIAS_FLAG).apply { style = Paint.Style.FILL; color = 0x22000000 }
                    drawRect(0f, 0f, tileSize.toFloat(), tileSize.toFloat(), fill)
                    drawRect(tileSize.toFloat(), tileSize.toFloat(), tileSize * 2f, tileSize * 2f, fill)
                }
            }, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT)
        }
        

        【讨论】:

          【解决方案5】:

          加载 2 张图片:黑白

          从一个包含可绘制对象和大小的类中创建一个二维数组 chessboard[8][8]

          创建一个二维循环

          for (i < 8)
           for (j < 8)
            draw with canvas (chessboard[i][j].drawable) 
          

          您可以使用 Google 搜索的关键字: 二维数组,用画布绘制

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-04-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多