Android: 为什么会抛出java.lang.IllegalStateException异常?

4

我有一个关于我的应用程序的小问题!这段代码:

package com.project.alpha_droid;

import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {

    Bitmap img;
    ImageView imagew;

    void fill(int x, int y, int c){
        if(img.getPixel(x,y)!=c){
            img.setPixel(x,y,c);
            if(img.getPixel(x+1,y)!=c){
                fill(x+1,y,c);
            }
            if(img.getPixel(x,y+1)!=c){
                fill(x,y+1,c);
            }
            if(img.getPixel(x-1,y)!=c){
                fill(x-1,y,c);
            }
            if(img.getPixel(x,y-1)!=c){
                fill(x,y-1,c);
            }
        }
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imagew = (ImageView) findViewById(R.id.drawing);
        imagew.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.d("Location", event.getX() + "x" + event.getY());
                img = ((BitmapDrawable)imagew.getDrawable()).getBitmap();
                fill(Math.round(event.getX()),Math.round(event.getY()), 0);
                imagew.setImageBitmap(img);
                return true;
            }
        });

    }
}

触发以下错误:

09-24 12:15:09.981 12764-12764/com.project.alpha_droid E/InputEventReceiver: Exception dispatching input event.
09-24 12:15:09.981 12764-12764/com.project.alpha_droid E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
09-24 12:15:09.981 12764-12764/com.project.alpha_droid E/MessageQueue-JNI: java.lang.IllegalStateException
                                                                        at android.graphics.Bitmap.setPixel(Bitmap.java:1746)
                                                                        at com.project.alpha_droid.MainActivity.fill(MainActivity.java:19)
                                                                        at com.project.alpha_droid.MainActivity$1.onTouch(MainActivity.java:47)
                                                                        at android.view.View.dispatchTouchEvent(View.java:9181)
                                                                        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2691)
                                                                        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2308)
                                                                        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2691)
                                                                        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2308)
                                                                        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2691)
                                                                        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2308)
                                                                        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2691)
                                                                        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2308)
                                                                        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2691)
                                                                        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2308)
                                                                        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2691)
                                                                        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2308)
                                                                        at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2743)
                                                                        at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1836)
                                                                        at android.app.Activity.dispatchTouchEvent(Activity.java:3043)
                                                                        at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:63)
                                                                        at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2704)
                                                                        at android.view.View.dispatchPointerEvent(View.java:9397)
                                                                        at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5082)
                                                                        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4899)
                                                                        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4356)
                                                                        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4409)
                                                                        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4375)
                                                                        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4501)
                                                                        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4383)
                                                                        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4558)
                                                                        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4356)
                                                                        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4409)
                                                                        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4375)
                                                                        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4383)
                                                                        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4356)
                                                                        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6979)
                                                                        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6852)
                                                                        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6823)
                                                                        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7069)
                                                                        at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
                                                                        at android.os.MessageQueue.nativePollOnce(Native Method)
                                                                        at android.os.MessageQueue.next(MessageQueue.java:143)
                                                                        at android.os.Looper.loop(Looper.java:130)
                                                                        at android.app.ActivityThread.main(ActivityThread.java:6934)
                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                        at java.lang.reflect.Method.invoke(Method.java:372)
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 

填充函数类似于油漆桶,您可以用它来填充您单击的区域的颜色。


5
您正在不可变的“Bitmap”上调用“setPixel()”。我不确定为什么他们没有为该“异常”提供消息。 - Mike M.
另外一件事是,你应该取消 event.setAction(MotionEvent.ACTION_CANCEL); - Mohammad Zarei
1个回答

6
你可以尝试将 Bitmap 复制到另一个可变的位图中。
   final Bitmap oldBitmap = ((BitmapDrawable) imagew.getDrawable()).getBitmap();

   //set the second param of copy to true so we get a **mutable** bitmap
   img = oldBitmap.copy(oldBitmap.getConfig, true);

   //recycle old. We don't need it anymore
   //oldBitmap.getBitmap().recycle()
   fill(Math.round(event.getX()),Math.round(event.getY()), 0);
   imagew.setImageBitmap(img);

img是一个Bitmap,不是BitmapDrawable。你不需要在那里使用BitmapDrawable。只需复制Bitmap即可。 - Mike M.
哦,我明白了。我错过了那个@MikeM。已经修复了。 - Peter Chaula
我刚注意到,你需要在第一行中将 imagew.getDrawable() 强制转换为 BitmapDrawable 才能从中获取 Bitmap((BitmapDrawable) imagew.getDrawable()).getBitmap() - Mike M.
这就是编辑的作用。这是社区内容。 - Peter Chaula
2
编辑其他用户的代码,除了一般格式调整、对齐、去除空格等之外,更改任何其他内容都是绝对不可以的。我不会更改任何会改变您代码功能的部分,而且我也希望您没有这样做过。留下评论是您发现编码错误的方式。 - Mike M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接