简体   繁体   English

触摸屏时应用程序崩溃

[英]Application crashes upon touching screen

So I am making a simple treasure hunter game.所以我正在制作一个简单的寻宝游戏。 I have implemented the SurfaceHolder.Callback and OnTouchListener methods.我已经实现了 SurfaceHolder.Callback 和 OnTouchListener 方法。 When touching the screen to dig for the treasure the app crashes.当触摸屏幕挖掘宝藏时,应用程序崩溃。

Here is the code for the DrawSurface class:这是 DrawSurface class 的代码:

public class DrawSurface extends SurfaceView implements SurfaceHolder.Callback, View.OnTouchListener {
    private static ArrayList<Item> mInventory;
    private final Rect mFieldDim = new Rect();
    private ArrayList<Item> mItems;
    private ArrayList<PointF> dugHoles;
    private Bitmap mBMPField;
    private Bitmap mBMPHole;
    private SurfaceHolder mHolder;
    private MotionEvent motionEvent;

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

    public static ArrayList<Item> getInventory() {
        return mInventory;
    }

    public void init() {
        getHolder().addCallback(this);
        setOnTouchListener(this);
        mItems = loadItems();
        dugHoles = new ArrayList<PointF>();
        mBMPField = BitmapFactory.decodeResource(getResources(), R.drawable.field);
        mBMPHole = BitmapFactory.decodeResource(getResources(), R.drawable.hole);
        mInventory = new ArrayList<Item>();
    }

    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        mHolder = surfaceHolder;
        Canvas c = mHolder.lockCanvas();
        mFieldDim.set(0, 0, c.getWidth(), c.getHeight());

        mHolder.unlockCanvasAndPost(c);

        for (int i = 0; i < mItems.size(); i++) {
            mItems.get(i).x = (int) (Math.random() * (float) mFieldDim.width());
            mItems.get(i).y = (int) (Math.random() * (float) mFieldDim.height());
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int i, int i2, int i3) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }

    public boolean onTouch(View v, MotionEvent event) {
        if (!(motionEvent.getAction() != MotionEvent.ACTION_DOWN)) {
            PointF touch = new PointF(motionEvent.getX(), motionEvent.getY());
            dugHoles.add(touch);
            int radius = Math.max(mBMPHole.getHeight(), mBMPHole.getWidth()) / 2;
            for (int i = mItems.size() - 1; i >= 0; i--) {
                Item item = mItems.get(i);
                int dx = item.x - (int) touch.x;
                int dy = item.y - (int) touch.y;

                if (dx * dx + dy * dy < radius * radius) {
                    mItems.remove(i);
                    mInventory.add(item);
                    Toast toast = Toast.makeText(this.getContext(), item.name + "found", Toast.LENGTH_SHORT);
                    toast.show();
                }
            }
            invalidate();
        }
        return true;
    }

    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (mBMPField != null) {
            canvas.drawBitmap(mBMPField, new Rect(0, 0, mBMPField.getWidth(), mBMPField.getHeight()), mFieldDim, new Paint());
        }

        if (mBMPHole != null) {
            for (PointF hole : dugHoles) {
                canvas.drawBitmap(mBMPHole,
                        new Rect(0, 0, mBMPHole.getWidth(), mBMPHole.getHeight()),
                        new RectF(hole.x - mBMPHole.getWidth() / 2, hole.y - mBMPHole.getHeight() / 2, hole.x + mBMPHole.getWidth() / 2, hole.y + mBMPHole.getHeight() / 2),
                        new Paint());
            }
        }
    }

    private ArrayList<Item> loadItems() {
        InputStream input = getResources().openRawResource(R.raw.items);
        BufferedReader reader = null;
        ArrayList<Item> items = new ArrayList<Item>();
        String itemName;

        try {
            reader = new BufferedReader(new InputStreamReader(input));
            while ((itemName = reader.readLine()) != null) {
                items.add(new Item(itemName));
            }
        } catch (Exception e) {
            Log.e("MainActivity", "Reading list of items failed!", e);
        } finally {
            try {
                if (reader != null) reader.close();
            } catch (Exception e) {
                Log.e("MainActivity", "Error closing file reader.", e);
            }
        }
        return items;
    }

Here is the error messages I recieve:这是我收到的错误消息:

E/AndroidRuntime: FATAL EXCEPTION: main Process: justinrhinehart.cse.fullsail.treasurehunter, PID: 23942 java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.MotionEvent.getAction()' on a null object reference at justinrhinehart.cse.fullsail.treasurehunter.DrawSurface.onTouch(DrawSurface.java:77) at android.view.View.dispatchTouchEvent(View.java:14305) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2742) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118) at ZC31B32364CE19CA8FC E/AndroidRuntime: FATAL EXCEPTION: main Process: justinrhinehart.cse.fullsail.treasurehunter, PID: 23942 java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.MotionEvent.getAction()' on a null object reference at justinrhinehart.cse.fullsail.treasurehunter.DrawSurface.onTouch(DrawSurface.java:77) at android.view.View.dispatchTouchEvent(View.java:14305) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118) at android .view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2742) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118) at ZC31B32364CE19CA8FC D150A417ECCE58Z.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2742) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2742) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2742) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2742) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java: D150A417ECCE58Z.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2742) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2742) at android.view.ViewGroup .dispatchTransformedTouchEvent(ViewGroup.java:3118) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2742) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup. java:2742) 在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java: 3118) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2742) at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:488) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1871) at android.app.Activity.dispatchTouchEvent(Activity.java:4125) at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69) at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:446) at android.view.View.dispatchPointerEvent(View.Z93F725A07423FE1C889F448B33D2 3118) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2742) at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:488) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow .java:1871) at android.app.Activity.dispatchTouchEvent(Activity.java:4125) at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69) at com.android.internal.policy.DecorView.dispatchTouchEvent( DecorView.java:446) 在 android.view.View.dispatchPointerEvent(View.Z93F725A07423FE1C889F448B33D2 1F46Z:14568) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:6016) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5819) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5310) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5367) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5333) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5485) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5341) at android 1F46Z:14568) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:6016) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5819) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl .java:5310) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5367) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5333) at android.view.ViewRootImpl$AsyncInputStage.forward( ViewRootImpl.java:5485) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5341) at android .view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5542) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5314) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5367) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5333) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5341) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5314) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:8080) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8 .view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5542) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5314) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5367) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5333) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5341) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5314) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:8080) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8 031) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7992) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:8203) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:220) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:335) at android.os.Looper.loop(Looper.java:183) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os. 031) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7992) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:8203) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:220) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:335) at android.os.Looper.loop(Looper.java:183) at android.app.ActivityThread.main( ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os. RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

Can anyone help me understand what the problem is?谁能帮我理解问题是什么?

You're trying to use a variable with an unassigned value when I think you meant to use the event parameter of your onTouch() .当我认为您打算使用onTouch()event参数时,您正在尝试使用具有未分配值的变量。 You should edit your onTouch to look something like this:你应该编辑你的 onTouch 看起来像这样:

public boolean onTouch(View v, MotionEvent event) {
    if (!(event.getAction() != MotionEvent.ACTION_DOWN)) {
        PointF touch = new PointF(event.getX(), event.getY());
        // ...
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM