【问题标题】:Android: checking whether there is anything drawn in to Android CanvasAndroid:检查是否有任何东西被吸引到 Android Canvas
【发布时间】:2015-10-16 14:18:11
【问题描述】:

我正在用 android 制作一个绘图应用程序。

在这里,我将画布上的绘图保存为 png 图像。我正在使用 Bitmap 数组来保存画布中的绘图。

if(view.getId()==R.id.save_btn){
    //save drawing
    AlertDialog.Builder saveDialog = new AlertDialog.Builder(this);
    saveDialog.setTitle("Save drawing");
    saveDialog.setMessage("Save drawing to device Gallery?");
    saveDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener(){
        public void onClick(DialogInterface dialog, int which){
            int k=0;
            //save drawing

            while(bits[k]!=null) {
                Bitmap m = null;

                m = bits[k];
                String path = Environment.getExternalStorageDirectory().getAbsolutePath();
                File file = new File(path + File.separator + "Pictures" + File.separator + k + "_image.png");
                FileOutputStream ostream;
                try {
                    file.createNewFile();
                    ostream = new FileOutputStream(file);
                    m.compress(Bitmap.CompressFormat.PNG, 100, ostream);
                    ostream.flush();
                    ostream.close();
                    Toast.makeText(getApplicationContext(), "image saved :" + path, Toast.LENGTH_SHORT).show();


                } catch (Exception e) {
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_SHORT).show();
                }
                k=k+1;
            }

            i=0;
            bits=null;
        }
    }
}

这里我将视图的 drawingCache 保存到位图数组中。 即使我的画布是空的,这里仍然会保存一个空白图像。

我不想要那个。我只想在画布上有任何绘图时保存。
那么有没有办法做到这一点呢?

或者有什么方法可以检查画布上是否有绘图??

【问题讨论】:

  • 你能设置一个标志/布尔值,在第一次绘图后改变吗?
  • 我没有尝试设置任何标志。我非常同意亨利的回答。但我认为这是可能的。

标签: android canvas bitmap android-canvas android-bitmap


【解决方案1】:

不要使用绘图缓存。在您的视图中有一个方法,如 getBitmap() 并使用该方法获取位图。您正在使用画布的默认位图。这很难操作,而是创建自己的位图,然后在该位图上绘制。这是一种更好的方法,不仅可以满足您的要求,还可以用于操作位图。

更新:您可以创建自己的位图并在其上绘制如下

Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);

现在你可以使用这个画布对象来绘制你想要的东西。在我的应用程序中,我专门安排了一堂课来处理绘图。我使用 CustomView 的onDraw() 来查看此位图并进行缩放。原画发生在我的专门课堂上。我已经覆盖了onTouchEvent() 并用它来处理各种绘图手势并使用这些输入在我的自定义位图上绘图。

但是如果你要使用drawingCache,那么看看这个:How to check if a Bitmap is empty (blank) on Android

【讨论】:

  • 嘿,我们如何创建自己的位图并使用它??
  • 嘿,我已经更新了上面的答案。希望这对您有所帮助。我最初也使用 CustomView 的默认位图来派生最终生成的位图。但后来当缩放和缩放之类的东西出现时,它很快就变成了一场噩梦。所以我只是将实际绘制和绘制的位图的查看分开。
  • 谢谢@Henry...我照你说的做了...我制作了一个自定义位图...现在我必须创建一种方法来获取正确的位图?那么这个返回语句对于 return this.getDrawingCache() 方法是否正确???
  • this.getDrawingCache() 将返回视图的默认位图。你永远不需要这样做。而是创建一个类似 drawBitmap() 的方法,并在其中创建一个位图并为其分配一个画布。对此执行所有 canvas.draw() 方法,最后返回位图。要在 CustomView 中显示此位图,在 onDraw() 方法中,只需调用 canvas.drawBitmap() 并传入此位图即可。
  • 好的..再次感谢老兄..:):)
【解决方案2】:

请参阅https://stackoverflow.com/a/29938454/755804 处的代码,它会检查给定的 Unicode 字符是否被绘制或显示为空白。

检查在:

boolean res = !orig.sameAs(bitmap);

【讨论】:

  • 这和创建一个重复的位图一样,但是被复制的不能改变它的像素值,对吧?
  • 是的。您将可能更改的副本与原始副本进行比较
  • 好的...让我试试看..然后会告诉你..无论如何谢谢..:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多