java - 在Android中实现类似bucket的方法

标签 java android

我创建了一个用于在 Android 中绘图的应用程序。 我想要一个类似于 Microsoft Paint 的水桶工具的工具 - 该工具将用所选颜色填充封闭区域。所以点击后,我写道:

boolean[][] didVisit = new boolean[getWidth()][getHeight()];
                visit ((int)event.getX(), (int)event.getY(), didVisit, mBitmap.getPixel((int)event.getX(), (int)event.getY()));

访问方式为:

private void visit (int x, int y, boolean[][] didVisit, int color)
        {
            if ( x < 0 || x >= didVisit.length || y < 0 || y >= didVisit[0].length  )
            {
                return;
            }
            if (  mBitmap.getPixel(x,y) != color )
                return;
            if ( didVisit[x][y] )
                return;
            didVisit[x][y] = true;
            mBitmap.setPixel(x, y, p.getColor());
            visit(x-1,y,didVisit,color);
            visit(x,y+1,didVisit,color);
            visit(x+1,y,didVisit,color);
            visit(x,y-1,didVisit,color);
        }

但是,这会导致应用程序崩溃(强制关闭)。我很困惑。我检查了几十遍,还是看不出是什么原因导致强制关闭的。

我很乐意提供任何帮助。 提前致谢。

最佳答案

我认为您的应用程序因堆栈溢出而崩溃。即使对于 30x30 图像,该算法也会进行深度为 900 的递归调用!我不确定 Android 的堆栈大小有多大,但我很确定您应该重新设计算法以避免递归。

更新:根据您的评论,我写的所有内容都是真实的。这个算法行不通。

关于java - 在Android中实现类似bucket的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5765619/

相关文章:

java - 我想实现一个搜索栏,它将接受一个字符串,然后它将过滤填充的 ListView 或在服务器上搜索该字符串

java - 将二维数组中的第二列和第三列检索到数组

javascript - 在移动网络应用程序中删除地址栏的跨平台方法

java - 解析 ListView 中的 ParseQueryAdapter 和多对多关系 [Parse.com]

java - 使用 Siddhi 与 NATS 服务器的连接问题

java - 为什么有些开发人员在 Java 的接口(interface)中声明 String 对象,它是如何工作的?

java - 将 JS 变量传递给 java 类

android - android studio 1.2 中红色的.gradle 文件是什么?

android - Android 中相当于 WPF Grid 的控件

java - 如何从 Firebase Firestore 访问数组数据?