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

时间:2012-12-31 13:24:07

标签: android camera draw surfaceview android-framelayout

我有一个surfaceview更新问题。 我想创建一个轻量级的增强现实应用程序,所以我在后面做了一个带有camerapreview的framelayout,并在前面做了一个扩展的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

{

private Paint textPaint = new Paint();
int x;
int y;
public DrawView(Context context) {

    super(context);

    // Create out paint to use for drawing
    textPaint.setARGB(255, 255, 255, 10);
    textPaint.setTextSize(60);
    x=100;
    y=100;
    /* This call is necessary, or else the 
     * draw method will not be called. 
     */
    setWillNotDraw(false);
}

@Override
protected void onDraw(Canvas canvas){
    // A Simple Text Render to test the display
    canvas.drawText("Sunfinder", 50, 50, textPaint);
    canvas.drawCircle(x, y, 30, textPaint);
}

问题是,我想改变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循环可以一直调用这个函数吗?我知道它在一个线程中会更好,但是框架布局搞砸了。 感谢您的阅读和任何帮助!

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案: 我必须使用invalidate()函数,并覆盖ondraw()。

因此,以下链接将重绘并更新屏幕。它不会改变cv在framelayout中的任何内容。

public void onSensorChanged(SensorEvent event) { 

        dv.invalidate(); 

    }

希望它有所帮助!