【问题标题】:Android canvas drawBitmap throwing null pointer exceptionAndroid画布drawBitmap抛出空指针异常
【发布时间】:2015-11-05 18:50:52
【问题描述】:

尝试向我的表面视图添加简单的背景,但 drawBitmap 似乎存在问题。我正在关注 youtube 教程,除了我制作了自己的可绘制 xml 布局文件之外,他所做的一切都是一样的,因为他没有显示他的,所以我认为问题可能出在 simple.xml 文件中。

错误

com.example.adam.hilo E/AndroidRuntime: FATAL EXCEPTION: Thread-2096
com.example.adam.hilo E/AndroidRuntime: Process: com.example.adam.hilo, PID: 19788
com.example.adam.hilo E/AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.Bitmap.isRecycled()' on a null object reference
com.example.adam.hilo E/AndroidRuntime: at android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1281)
com.example.adam.hilo E/AndroidRuntime:  at android.graphics.Canvas.drawBitmap(Canvas.java:1337)
com.example.adam.hilo E/AndroidRuntime: at com.example.adam.hilo.Activity_Staircase_Layout.run(Activity_Staircase_Layout.java:36)
com.example.adam.hilo E/AndroidRuntime: at java.lang.Thread.run(Thread.java:818)

Activity_Staircase_Layout

public class Activity_Staircase_Layout extends SurfaceView implements Runnable {

    Thread thread = null;
    boolean can_draw;

    Bitmap background;
    Canvas canvas;
    SurfaceHolder surface_holder;

    public Activity_Staircase_Layout(Context context) {
        super(context);
        surface_holder = getHolder();
        background = BitmapFactory.decodeResource(getResources(), R.drawable.simple);
    }

    @Override
    public void run() {
        while(can_draw) {
            if(!surface_holder.getSurface().isValid()) {
                continue;
            }

            canvas = surface_holder.lockCanvas();
            canvas.drawBitmap(background,0,0,null);
            surface_holder.unlockCanvasAndPost(canvas);
        }
    }

    public void pause() {
        can_draw = false;

        while(true) {
            try {
                thread.join();
                break;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        thread = null;
    }

    public void resume() {
        can_draw = true;
        thread = new Thread(this);
        thread.start();
    }
}

可绘制/Simple.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <!-- Specify a semi-transparent solid green background color -->
    <solid android:color="#5500FF66" />

    <!-- Specify a dark green border -->
    <stroke
        android:width="5dp"
        android:color="#009933" />
</shape>

StaircaseActivity.java

public class StaircaseActivity extends AppCompatActivity {

    Activity_Staircase_Layout staircase_LayoutView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        staircase_LayoutView = new Activity_Staircase_Layout(this);
        setContentView(staircase_LayoutView);
    }

    @Override
    public void onPause() {
        super.onPause();
        staircase_LayoutView.pause();
    }

    @Override
    public void onResume() {
        super.onResume();
        staircase_LayoutView.resume();
    }

}

【问题讨论】:

    标签: java android xml android-canvas surfaceview


    【解决方案1】:

    这里的问题是background bitmap is null in the line : canvas.drawBitmap(background,0,0,null);

    在调用drawBitmap 方法时,确保background 位图不为空。

    请执行以下操作以确认这一点:

      if(background != null){
           canvas.drawBitmap(background,0,0,null);
      } else {
           Log.d("DEBUG","background is null");
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 2017-06-13
      • 2014-06-12
      • 2020-11-22
      • 2020-08-10
      相关资源
      最近更新 更多