意外调用android canvas.drawColor
我正在创建一个绘画应用程序 在我的程序中有一个名为tool的变量,它存储正在使用的工具的名称。最初它被设置为free hand,但当工具更改为任何其他工具时,当我将工具切换回free hand时,屏幕将被清除为黑色 .因此,我无法画自由手,但在我的手指后面只出现一个点 我调试了这个程序,发现一旦调用了用黑色清除屏幕的语句,即使没有定义要调用它,它也会被调用。这是我的一段代码:意外调用android canvas.drawColor,android,Android,我正在创建一个绘画应用程序 在我的程序中有一个名为tool的变量,它存储正在使用的工具的名称。最初它被设置为free hand,但当工具更改为任何其他工具时,当我将工具切换回free hand时,屏幕将被清除为黑色 .因此,我无法画自由手,但在我的手指后面只出现一个点 我调试了这个程序,发现一旦调用了用黑色清除屏幕的语句,即使没有定义要调用它,它也会被调用。这是我的一段代码: if(tool.equals("freeHand")){ Log.d("free","move"
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))
)上放置一个断点,然后逐步执行。当您将工具更改为其他工具时,画布变为黑色并在其上绘制,当您返回到手动工具时,希望发生什么?是否希望背景再次变为白色,而所有内容仍在其上绘制?