Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android无法在onCreate()中更新SurfaceView?_Android_Canvas_Surfaceview - Fatal编程技术网

Android无法在onCreate()中更新SurfaceView?

Android无法在onCreate()中更新SurfaceView?,android,canvas,surfaceview,Android,Canvas,Surfaceview,我想做的是创建一个带有SurfaceView的绘图应用程序。我的应用程序基本上完成了,但缺少一件事:我无法让SurfaceView在创建其活动时自行绘制 我的SurfaceView派生类如下所示(只是重要部分): 以及活动的onCreate: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATUR

我想做的是创建一个带有SurfaceView的绘图应用程序。我的应用程序基本上完成了,但缺少一件事:我无法让SurfaceView在创建其活动时自行绘制

我的
SurfaceView
派生类如下所示(只是重要部分):

以及活动的onCreate:

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    surface = new DrawingSurface(this);
    setContentView(surface);
    //surface.paint(); <--- here is the problem
}
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(窗口。功能\u无\u标题);
表面=新图纸表面(本);
setContentView(表面);

//surface.paint();尝试不同的模型。在SurfaceView中进行所有绘制

public class DrawingSurface extends SurfaceView implements SurfaceHolder.Callback {
    public DrawingSurface(Context context) {
        super(context);
        getHolder().addCallback(this);
    }
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {
        updatePanel();
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        updatePanel();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        updatePanel();
    }

    public void updatePanel() {
        Canvas canvas = null;
        try {
            canvas = getHolder().lockCanvas(null);
            synchronized (getHolder()) {
                doDraw(canvas);
            }
        }
        finally {
            if (canvas != null) {
                getHolder().unlockCanvasAndPost(canvas);
            }
        }
    }
}
您还可以在touch listener中调用updatePanel方法


所有的绘制都在doDraw方法中进行,该方法从未在SurfaceView之外调用。此外,在尝试绘制任何内容之前,请确保在画布对象上的doDraw中执行空检查。

嘿!谢谢,但我实际上是在SurfaceView中绘制的。当我查看li时,Eclipse甚至不提供这些要重写的函数这些方法是什么样的类?抱歉,我遗漏了一条重要信息。这些方法属于SurfaceHolder.Callback。实现它并在构造函数中将surfaceView设置为自己的回调。当天的英雄:D非常感谢!!
public class DrawingSurface extends SurfaceView implements SurfaceHolder.Callback {
    public DrawingSurface(Context context) {
        super(context);
        getHolder().addCallback(this);
    }
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {
        updatePanel();
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        updatePanel();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        updatePanel();
    }

    public void updatePanel() {
        Canvas canvas = null;
        try {
            canvas = getHolder().lockCanvas(null);
            synchronized (getHolder()) {
                doDraw(canvas);
            }
        }
        finally {
            if (canvas != null) {
                getHolder().unlockCanvasAndPost(canvas);
            }
        }
    }
}