Java 我的Android自定义精灵类的问题

Java 我的Android自定义精灵类的问题,java,android,sprite,Java,Android,Sprite,我目前正在为android的java设计一个基本的sprite类,因为我不想使用2d引擎,而且出于某种原因Google没有提供任何sprite API 无论如何,我的问题是关于我设计的课程。我有一个Sprite类,它获取位图并将其转换为Sprite。然后,当用户创建一个新的SpriteContainer时,这个sprite可以传递给我创建的自定义视图 我的DynamicScreetContainer代码如下: package com.me.spriteGraphics; import andr

我目前正在为android的java设计一个基本的sprite类,因为我不想使用2d引擎,而且出于某种原因Google没有提供任何sprite API

无论如何,我的问题是关于我设计的课程。我有一个Sprite类,它获取位图并将其转换为Sprite。然后,当用户创建一个新的SpriteContainer时,这个sprite可以传递给我创建的自定义视图

我的DynamicScreetContainer代码如下:

package com.me.spriteGraphics;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class DynamicSpriteContainer extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder holder;
    public int x, y;
    private Bitmap b;
    public Sprite sprite;
    private Canvas c = new Canvas();
    private boolean bool = false;

    public DynamicSpriteContainer(Context context, Sprite spriteImage) {
        //public ImageView(Context context) {
        super(context);

        //get sprite
        b = spriteImage.getBitmap();

        //set holder
        holder = getHolder();
        holder.addCallback(this);

        //set position
        x = y = 0;

        update();
    }

    public void surfaceCreated(SurfaceHolder holder) {
        c = holder.lockCanvas();
        c.drawARGB(255, 150, 150, 10);

        //set up bitmap image
        c.drawBitmap(b, x, y, null);
        holder.unlockCanvasAndPost(c);
        update();
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    public void surfaceDestroyed(SurfaceHolder holder) {

    }

    private void update() {
        //this code will alter the character in the way the developer specifies (per frame)
        Thread repeat = new Thread( new Runnable() {
            public void run() {
                try {
                    //move sprite in constant motion
                    while (bool) {
                        //redraw
                        c = holder.lockCanvas();
                        c.drawARGB(255, 150, 150, 10);

                        //set up bitmap image
                        c.drawBitmap(b, x, y, null);
                        holder.unlockCanvasAndPost(c);
                    }
                } catch (Error e) {
                    e.printStackTrace();
                    bool = false;
                }
            }
        });
        repeat.start();
    }

    public void setX(int x) {
        //notice how this same code above has the holder, the holder is recognized above, not here.
        c = holder.lockCanvas();
        c.drawARGB(255, 150, 150, 10);

        //set up bitmap image
        c.drawBitmap(b, x, y, null);
        holder.unlockCanvasAndPost(c);       
    }

    //set the info on pause, resume, stop...
    //this data is for error stopping, so the app can resume and stop without passing an error to the user!
    public void passInfo(boolean isPaused, boolean isResumed, boolean isStopped) {
        if (isPaused && sprite.auto) {
            bool = false;
        }

        if (isResumed && sprite.auto) {
            bool = true;
        }

        if (isStopped && sprite.auto) {
            bool = false;
        }
    }
}
抱歉,代码摘录太长了

主要的问题是在update函数中,holder是可以识别的,但是在setX中,它不是

如何让setX识别支架


提前谢谢你

你到底是什么意思?您的IDE未解析holder?它仅在SetXt中的holder上提供NullPointerExection。如果画布未解锁,lockCanvas方法将返回null。当您调用setX时,更新方法可能正在使用画布。谢谢您的评论。我尝试过使用setX,更新函数被注释掉了。它仍然给出同样的回答