Android 如何更新封装在Framelayout中的surfaceview?

Android 如何更新封装在Framelayout中的surfaceview?,android,camera,draw,surfaceview,android-framelayout,Android,Camera,Draw,Surfaceview,Android Framelayout,我有一个surfaceview更新问题。 我想创建一个轻量级的增强现实应用程序,所以我做了一个框架布局,后面是camerapreview,前面是扩展的surfaceview alParent = new FrameLayout(this); alParent.setLayoutParams(new LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.FILL_PA

我有一个surfaceview更新问题。 我想创建一个轻量级的增强现实应用程序,所以我做了一个框架布局,后面是camerapreview,前面是扩展的surfaceview

alParent = new FrameLayout(this);
        alParent.setLayoutParams(new LayoutParams(
                LayoutParams.FILL_PARENT,
                LayoutParams.FILL_PARENT));

        // Create a new camera view and add it to the layout
        cv = new CameraPreview(this,c);
        alParent.addView(cv);

        // Create a new draw view and add it to the layout
        dv = new DrawView(this);
        dv.reDraw();
        alParent.addView(dv);
之后,我可以在相机照片上画一个圆圈,这很好:

public class DrawView extends SurfaceView
{

问题是,我想更改x和y,并经常重新绘制圆。 我已经知道我必须使用这样的东西:

protected void reDraw()
{
    x+=10;
    SurfaceHolder surfaceHolder;
    surfaceHolder = getHolder();
     if(surfaceHolder.getSurface().isValid())
    {onDraw(surfaceHolder.lockCanvas());}
     else System.out.println("problem");
}
(注意,这只是一个测试圆是否移动的示例) 我的问题是如何以及在何处调用此函数?我认为这是由framelayout引起的复杂问题

如果我在我首先收集的活动(dv.redraw)中调用它,我会得到一个空指针异常。 不管怎样,在活动中有一个while循环可以随时调用这个函数吗?我知道在线程中会更好,但是框架布局把它搞糟了。 感谢您的阅读和帮助!

我找到了一个解决方案:

我必须使用invalidate()函数,并重写
ondraw()
方法

因此,下面的链接将重新绘制并更新屏幕。它不会改变cv在
框架布局中的位置

public void onSensorChanged(SensorEvent event)
{ 
    dv.invalidate(); 
}
希望它能帮助别人!

我找到了一个解决方案:

我必须使用invalidate()函数,并重写
ondraw()
方法

因此,下面的链接将重新绘制并更新屏幕。它不会改变cv在
框架布局中的位置

public void onSensorChanged(SensorEvent event)
{ 
    dv.invalidate(); 
}
希望它能帮助别人