我对android应用程序开发有点新,所以原谅我的菜鸟代码。我正在尝试基于运动来编写游戏。当您旋转手机时,它将屏幕上的一个物体(一个桶)从右向左滑动以捕捉掉落的物体。我在这个类中有一个主要活动和一个私人SurfaceView。我也有一个自定义线程在其中运行。我不知道为什么我的位图为空。它应该在其他地方初始化吗?
这是错误: 致命异常:主 工艺:course.examples.databaseanimation,PID:17583 显示java.lang.NullPointerException:尝试调用虚拟方法 '诠释android.graphics.Bitmap.getWidth()'在空对象引用 at android.graphics.Bitmap.createBitmap(Bitmap.java:659) at course.examples.databaseanimation.BucketThread。(BucketThread.java:25) at course.examples.databaseanimation.MainActivity $ BucketView。 surfaceCreated(MainActivity.java:102) at android.view.SurfaceView.updateWindow(SurfaceView.java:582) 在android.view.SurfaceView $ 3.onPreDraw(SurfaceView.java:177) 在android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944) 在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2067) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1119) at android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:6060) at android.view.Choreographer $ CallbackRecord.run(Choreographer.java:858 ) at android.view.Choreographer.doCallbacks(Choreographer.java:670) at android.view.Choreographer.doFrame(Choreographer.java:606) 在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:844) at android.os.Handler.handleCallback(Handler.java:746) at android.os.Handler.dispatchMessage(Handler.java:95) 在android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5443) at java.lang.reflect.Method.invoke(Native Method) at com。 android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:728) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
这是我的主题:
public class BucketThread extends Thread {
private SurfaceHolder holder;
private boolean running = true;
private float shiftY;
private float vy;
private float x;
private Bitmap mBucket = Bitmap.createBitmap(BitmapFactory.decodeResource
(Resources.getSystem(), R.mipmap.ic_launcher));
public BucketThread(SurfaceHolder holder){
this.holder = holder;
x = 0;
}
public void run(){
while(running){
Canvas canvas = null;
try{
canvas = holder.lockCanvas();
synchronized (holder){
//update
vy += shiftY * 0.1;
x += vy;
//draw
Paint mPaint = new Paint();
canvas.drawBitmap(mBucket, x, 0, mPaint);
}
}
finally {
if(canvas != null){
holder.unlockCanvasAndPost(canvas);
}
}
}
}
public void setRunning(boolean r){
running = r;
}
public void setShift(float shiftY){
this.shiftY = shiftY;
}
}
这是我的主要活动:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout mainFrame = (RelativeLayout) findViewById
(R.id.main_frame);
BucketView bv = new BucketView(getApplicationContext());
mainFrame.addView(bv);
}
private class BucketView extends SurfaceView implements SurfaceHolder.Callback,
SensorEventListener {
//private final Bitmap mBucket;
//private DisplayMetrics mDisplay;
private SurfaceHolder mSurfaceHolder;
private BucketThread mBuckThread;
//private int mDisplayWidth;
//private float mY;
public BucketView(Context context) {
super(context);
mSurfaceHolder = getHolder();
mSurfaceHolder.addCallback(this);
SensorManager manager = (SensorManager) context.getSystemService
(Context.SENSOR_SERVICE);
if (manager.getSensorList(Sensor.TYPE_ACCELEROMETER).size() != 0) {
Sensor accelerometer = manager.getSensorList(Sensor
.TYPE_ACCELEROMETER).get(0);
manager.registerListener(this, accelerometer, SensorManager
.SENSOR_DELAY_GAME);
}
}
@Override
public void onSensorChanged(SensorEvent event) {
if (mBuckThread != null) {
mBuckThread.setShift(event.values[1]);
Log.i("Main Activity", getClass().getSimpleName() + "onSensorChanged");
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mBuckThread = new BucketThread(holder);
mBuckThread.setRunning(true);
mBuckThread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
mBuckThread.setRunning(false);
while (retry) {
try {
mBuckThread.join();
retry = false;
} catch (InterruptedException e) {
}
}
}
}
}
可能重复[什么是NullPointerException,以及如何解决它?](https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-doi-i-fix -it) – Daniele