自定义类中的Android SurfaceView

时间:2016-05-10 23:37:19

标签: android surfaceview

所以我继续使用我在Android Studio中执行的项目遇到NullPointerException。我需要在我调用DrawSurface的自定义类中显示一个图像。我似乎无法找到与我的问题有关的任何事情。我已经检查了以前的各种问题并观看了很多视频。

我抛出的错误看起来像这样:

  在Android.graphics.Canvas.drawBitmap(Canvas.java:1325)的edu。########上的android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1269)中的java.lang.NullPointerException。 #####。cse.treasurehunter。###########。在edu的DrawSurface.onDraw_Original(DrawSurface.java:60)。########。#####。 cse.treasurehunter。###########。DrawSurface.onDraw(DrawSurface.java:-1)

我的.xml看起来像这样:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="fill_parent" android:orientation="vertical" tools:context=".MainActivity">
<edu.########.####.cse.treasurehunter.###########.DrawSurface android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" android:id="@+id/dsField"/>
<LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="50dp">
    <Button android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="0.5" android:text="View Inventory" android:id="@+id/btnInventory"/>
    <Button android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="0.5" android:text="Credits" android:id="@+id/btnCredits"/>
</LinearLayout>

我的DrawSurface类看起来像这样:

public class DrawSurface extends SurfaceView {
private Bitmap mBMPField;
private SurfaceHolder holder;

public DrawSurface(Context context) {
    super(context);
    holder = getHolder();
    holder.addCallback(new SurfaceHolder.Callback() {

        @Override
        public void surfaceCreated(SurfaceHolder holder) {

        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            Canvas c = holder.lockCanvas();
            onDraw(c);
            holder.unlockCanvasAndPost(c);
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {

        }
    });
    mBMPField = BitmapFactory.decodeResource(getResources(), R.drawable.field);
}

public DrawSurface(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public DrawSurface(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawColor(Color.DKGRAY);
    canvas.drawBitmap(mBMPField, 100, 200, null);
}

}

2 个答案:

答案 0 :(得分:0)

  1. 如果您的目标是在SurfaceView的Surface上绘制(而不是SurfaceView的视图),请不要覆盖onDraw()onDraw()适用于custom views。如果您真的想使用Surface,请将该方法命名为其他内容。
  2. 除非您发布静态图片,否则不要仅在surfaceChanged()中绘图。首次创建Surface时,通常会调用该方法一次,除非某些内容更改了Surface的大小。如果您只想从Bitmap获取静态图像,请考虑使用ImageView。
  3. 不要认为lockCanvas()会成功。你可以非常安全地从surfaceChanged()调用它,但通常你会想要检查返回值。
  4. 不要认为BitmapFactory.decodeResource()会成功。
  5. 由于您的drawColor()来电成功,而drawBitmap()来电失败,我的猜测是mBMPField为空。根据{{​​1}}的文档:

      

    [返回]已解码的位图,如果无法解码图像数据,则返回null,...

    它在出错时返回null,而不是抛出异常,所以你需要检查返回值。

答案 1 :(得分:0)

好的,发生的事情是我没有在我的构造函数中声明的初始化函数。所以一旦我开始使用Init();我搞定了。再次感谢您的指示和方向。没有它我就不会注意到这一部分。