意外调用android canvas.drawColor

意外调用android canvas.drawColor,android,Android,我正在创建一个绘画应用程序 在我的程序中有一个名为tool的变量,它存储正在使用的工具的名称。最初它被设置为free hand,但当工具更改为任何其他工具时,当我将工具切换回free hand时,屏幕将被清除为黑色 .因此,我无法画自由手,但在我的手指后面只出现一个点 我调试了这个程序,发现一旦调用了用黑色清除屏幕的语句,即使没有定义要调用它,它也会被调用。这是我的一段代码: if(tool.equals("freeHand")){ Log.d("free","move"

我正在创建一个绘画应用程序

在我的程序中有一个名为tool的变量,它存储正在使用的工具的名称。最初它被设置为free hand,但当工具更改为任何其他工具时,当我将工具切换回free hand时,屏幕将被清除为黑色

.因此,我无法画自由手,但在我的手指后面只出现一个点

我调试了这个程序,发现一旦调用了用黑色清除屏幕的语句,即使没有定义要调用它,它也会被调用。这是我的一段代码:

  if(tool.equals("freeHand")){

         Log.d("free","move");
        try{
            canvas=null;
            canvas = holder.lockCanvas();

             synchronized (holder) {

                 //draw(canvas);
                 canvas2.drawBitmap(backup,0,0,paint);
                 canvas2.drawLine(startX, startY, moveX ,moveY, paint);
                 //backup=Bitmap.createBitmap(cache);
                 draw(canvas);

             }
            }finally{
             if(canvas != null){
              holder.unlockCanvasAndPost(canvas);
             // backup=Bitmap.createBitmap(cache);
             }
            }
        //canvas2.drawLine(startX, startY, moveX ,moveY, paint);
        startX = moveX;
        startY = moveY;

        //backup=Bitmap.createBitmap(cache);

    }

     else{
         if(!tool.equals("freeHand") ){
            canvas2.drawColor(Color.BLACK);
            Log.d("free", "bug");


         }

     if(tool=="line"){

        try{
            canvas=null;
            canvas = holder.lockCanvas();

             synchronized (holder) {

                 //draw(canvas);
                 canvas2.drawBitmap(backup,0,0,paint);
                 canvas2.drawLine(downX,downY,moveX,moveY, paint);
                 draw(canvas);

             }
            }finally{
             if(canvas != null){
              holder.unlockCanvasAndPost(canvas);
             }
            }
        //canvas2.drawBitmap(backup, 0, 0, paint);
        //canvas2.drawLine(downX,downY,moveX,moveY, paint);


    }

     if(tool == "strokeRect"){

        try{
            canvas=null;
            canvas = holder.lockCanvas();

             synchronized (holder) {

                 //draw(canvas);
                 canvas2.drawBitmap(backup,0,0,paint);
                 canvas2.drawCircle(moveX, moveY, 20, paint);
                 draw(canvas);

             }
            }finally{
             if(canvas != null){
              holder.unlockCanvasAndPost(canvas);
             }
            }

        //canvas2.drawCircle(moveX, moveY, 20, paint);
    }

     if(tool == "fillRect"){

        try{
            canvas=null;
            canvas = holder.lockCanvas();

             synchronized (holder) {

                 //draw(canvas);
                 canvas2.drawBitmap(backup,0,0,paint);
                 canvas2.drawRect(downX, downY, moveX, moveY, paint);   
                 draw(canvas);

             }
            }finally{
             if(canvas != null){
              holder.unlockCanvasAndPost(canvas);
             }
            }


        //canvas2.drawRect(downX, downY, moveX, moveY, paint);  
    }
     if(tool=="img"){

            try{
                canvas=null;
                canvas = holder.lockCanvas();

                 synchronized (holder) {

                     //draw(canvas);
                     canvas2.drawBitmap(backup,0,0,paint);
                     canvas2.drawBitmap(img,moveX,moveY,paint);
                     //canvas2.drawBitmap(backup,0,0,paint);
                     draw(canvas);

                 }
                }finally{
                 if(canvas != null){
                  holder.unlockCanvasAndPost(canvas);
                 }
                }

        }

     }
我认为声明:

canvas2.drawColor(Color.BLACK);
这是问题的根源


如何消除对语句的不必要调用?

您不能像这样比较字符串:

tool!="freeHand"
字符串是对象和
=测试两个对象是否不是同一个对象

相反,使用
equals()
方法测试字符串的内容:

!tool.equals("freeHand")
因为“字符串实习”,有时
=
==
将起作用,但您不应该依赖它

你也可以考虑不要使用字符串。枚举如何

public enum Tool {Freehand, Eraser, Paintbrush }

...    

private Tool tool;

...

tool = Tool.Freehand;

...

if(tool == Tool.Freehand)
{
    ...
}

更好…

当您使用黑色清除屏幕时,它将清除屏幕上的所有内容,现在即使您将颜色设置为原始颜色,您先前绘制的任何内容都将不可见,它将被颜色透支

当我将刀具切换回自由手时,屏幕将被清除 黑色的


当您切换回时,必须再次设置颜色,否则一旦设置,颜色将保持原样

您是否使用调试器检查代码以观察发生了什么?是的,我甚至在检查清除屏幕时设置了另一个条件,发现一旦调用屏幕清除语句,它自己被召唤,你说“自己被召唤”是什么意思?只有在代码调用它时才会调用它。如果您单步执行,您将确切地看到正在执行哪些语句以及执行原因。请编辑您的帖子并显示代码,现在您已经修复了字符串比较的问题。我已经放置了一个调试语句,以便在调用该语句时通知我。我发现除了徒手工具外,其他工具都调用了该语句,但屏幕仍然被清除,因此我无法进行笔划,但屏幕上只显示一个点跟随我的手指移动。使用去毛刺器,而不是日志语句,否则你看不到发生了什么。在第一行(
if(tool.equals(freeHand))
)上放置一个断点,然后逐步执行。当您将工具更改为其他工具时,画布变为黑色并在其上绘制,当您返回到手动工具时,希望发生什么?是否希望背景再次变为白色,而所有内容仍在其上绘制?