1

我有一个表面视图更新问题。我想创建一个轻量级的增强现实应用程序,所以我做了一个框架布局,后面有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

{

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");
}

(注意这是一个测试圆圈是否移动的例子)我的问题是如何以及在哪里调用这个函数?我认为这是由框架布局引起的复杂。

如果我在我首先复制的活动中调用它(dv.redraw),我得到一个空指针异常。无论如何,是否可以在活动中有一个while循环来一直调用这个函数?我知道在一个线程中会更好,但是框架布局把它搞砸了。感谢您的阅读和任何帮助!

4

1 回答 1

1

我找到了一个解决方案:

我必须使用 invalidate() 函数,并覆盖该ondraw()方法。

所以下面的链接将重绘和更新屏幕。它不会改变 cv 在 a 中的 a Framelayout

public void onSensorChanged(SensorEvent event)
{ 
    dv.invalidate(); 
}

希望它可以帮助某人!

于 2013-01-02T10:02:33.013 回答