【问题标题】:Drawing a Moving Grid on Android Canvas?在 Android Canvas 上绘制移动网格?
【发布时间】:2021-01-19 05:11:24
【问题描述】:

是否可以在回收点的画布上创建和绘制移动网格?我想在一个安卓画布上创建一个网格,当一个点到达屏幕底部时,它会向下移动并回收它的点。

问题的第一部分是:如何在 Android Canvas 上绘制带有线条的网格? 第二部分:如何让它滚动和重复? 网格应如下所示:

我曾尝试使用 Bitmap 执行此操作,但我不确定这是否与使用 Draw Line 功能一样有效。另外,使用位图时我无法访问网格点,因此在尝试绘制图形时它不是很有用。

【问题讨论】:

  • 一定要爱那些对问题投反对票,甚至不告诉我原因的人。
  • 我不知道人们为什么投票,但您似乎已经回答了您的第一个问题,并且您没有尝试解决第二个问题。因此,您的帖子可能看起来像是请求某人为您编写代码。
  • 哦。我不是要代码。我只是在寻找一些关于如何做到这一点的建议。
  • 我会手动绘制网格。在性能方面,它必须比每帧重绘一个完整的位图更好。它的编码会稍微复杂一些,但如果你仍然需要网格坐标,那么它几乎只是几个循环,drawLine() 调用更多。
  • 好的,谢谢,只是不确定。

标签: android canvas grid


【解决方案1】:

标记Balha的答案:

android/java 等效项如下所示:

int canvasWidth = 0;
int canvasHeight = 0;
float gridSize = 20f;
float ecart = Math.max(mCanvasHeight, mCanvasWidth) / gridSize;
//last j index value
int lj= 0;
//last i index value
int li = 0;
canvasWidth = canvas.getWidth();
canvasHeight = canvas.getHeight();
for (int j = 0; j <= Math.min(canvasWidth, canvasHeight); j += (int)ecart)
{
    for (int i = 0; i <= Math.max(canvasWidth, canvasHeight); i += (int)ecart)
    {
        li = i;
    }
    lj = j;
 }

 canvas.clipRect(0, 0, lj, canvas.getHeight());

 for (int j = 0; j <= Math.min(canvasWidth, canvasHeight); j += (int)ecart)
 {
     for (int i = 0; i <= Math.max(canvasWidth, canvasHeight); i += (int)ecart)
     {
        //horizontal lines
        canvas.drawLine(j, i, i, i, paint);

         //vertical lines
         canvas.drawLine(j, i, j, j, paint);
     }
   }

【讨论】:

    【解决方案2】:

    我知道为时已晚,但它可以帮助别人; 这绘制了一个完美的网格 注意:这是一个c#代码

            float gridSize = 20f;
       var ecart = Math.Max(MaxHeight, MaxWidth) / gridSize;
    
        //last j index value
        int lj= 0;
        //last i index value
        int li = 0;
        for (int j = 0; j <= Math.Min(canvas.Width, canvas.Height); j += (int)ecart)
        {
            for (int i = 0; i <= Math.Max(canvas.Width, canvas.Height); i += (int)ecart)
            {
                li = i;
            }
            lj = j;
        }
        canvas.ClipRect(0, 0, lj, canvas.Height);
    
        for (int j = 0; j <= Math.Min(canvas.Width, canvas.Height); j += (int)ecart)
        {
            for (int i = 0; i <= Math.Max(canvas.Width, canvas.Height); i += (int)ecart)
            {
                //horizontal lines
                canvas.DrawLine(j, i, i, i, paint);
    
                //vertical lines
                canvas.DrawLine(j, i, j, j, paint);
            }
        }
    

    【讨论】:

    • android 应用现在可以用多种语言编写,包括 c#
    【解决方案3】:

    我正在开发一个绘图应用程序,我遇到了同样的问题。我到处搜索,但找不到直接的解决方案。这就是为什么我开发了一个可以做到这一点的库。它创建了一个可以变换的无限网格,包括变换:TranslateRotateScale。该库仅生成可见线,这些线显示在视图上,并使用简单的数学实时生成。这是library的直接链接

    解释很简单,如果你想了解更多关于它是如何工作的,你可以查看Wiki页面。

    如果您有兴趣,这里是图书馆source code 的链接。

    【讨论】:

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