2016-05-10 2 views
1

Так что я продолжаю работать в NullPointerException с проектом, который я делаю в Android Studio. Мне нужно, чтобы изображение отображалось в пользовательском классе, я вызываю DrawSurface. Я просто не могу найти ничего, что связано с моей проблемой. Я проверил различные предыдущие вопросы и просмотрел так много видео.Android SurfaceView в пользовательском классе

Ошибка Я выброшен выглядит следующим образом:

java.lang.NullPointerException в android.graphics.Canvas.throwIfCannotDraw (Canvas.java:1269) в android.graphics.Canvas.drawBitmap (Canvas .java: 1325) at edu. ########. #####. cse.treasurehunter. ###########. DrawSurface.onDraw_Original (DrawSurface.java:60) at Edu. ########. #####. 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); 
} 

}

ответ

0
  1. Не перегружайте onDraw(), если ваша цель состоит в том, чтобы нарисовать на поверхности SurfaceView (как противоположность представление SurfaceView). onDraw() для custom views. Если вы действительно хотите использовать Surface, назовите метод что-то еще.
  2. Не рисуйте только в surfaceChanged(), если вы не публикуете статическое изображение. Этот метод обычно вызывается один раз, когда поверхность сначала создается, если только что-то не изменит размер поверхности. Если вам просто нужно статическое изображение из растрового изображения, попробуйте вместо этого использовать ImageView.
  3. Не предполагайте, что lockCanvas() преуспеет. Вы довольно безопасно назовите его с surfaceChanged(), но в целом вы захотите проверить возвращаемое значение.
  4. Не предполагайте, что BitmapFactory.decodeResource() преуспеет.

С вашего drawColor() вызова преуспевает, и ваш drawBitmap() вызов не удается, я думаю, что mBMPField равна нулю. Согласно документации для decodeResource():

[Возврат] декодированный растровый, или нулевого значение, если данные изображений не может быть расшифрованы, ...

Это возвращение нуля на ошибке, не бросать исключение , поэтому вам нужно будет проверить возвращаемое значение.

+0

Итак, я очистил свое переопределение от 'onDraw()' и переименовал его. Я также хочу, чтобы статическое изображение было установлено на место, поэтому для этого изображенияView было бы достаточно? Я попытался определить «mBMPField» около вершины, но можно ли его повесить с помощью частного? Я благодарю вас за вашу помощь, я совершенно новичок в Android и Java, но я очень рад узнать. – cleverCorvid

+0

Если вы новичок, я бы держался подальше от SurfaceView.Либо используйте пользовательский вид (см. Ссылку в ответе), либо просто файл ImageView, который специально предназначен для отображения статического растрового изображения. Ничто из этого не решает основной вопрос: 'decodeResource()' failing, и если да, то почему? Запишите возвращаемое значение и проверьте вывод logcat. – fadden

+0

Я получаю эту ошибку от logcat: '05-10 18: 43: 40.389 2461-2583/edu. ########. Cse. ###########. Treasurehunter _ ## ######### E/Поверхность: getSlotFromBufferLocked: неизвестный буфер: 0xb4058040' – cleverCorvid

0

Хорошо, так случилось, что у меня не было функции инициализации, указанной в моем конструкторе. Поэтому, как только я начал использовать Init(); Я заработал. Еще раз спасибо за указатели и направление. Без этого я бы не заметил этой части.

Смежные вопросы