我有一个表面视图更新问题。我想创建一个轻量级的增强现实应用程序,所以我做了一个框架布局,后面有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循环来一直调用这个函数?我知道在一个线程中会更好,但是框架布局把它搞砸了。感谢您的阅读和任何帮助!