我有一个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循环可以一直调用这个函数吗?我知道它在一个线程中会更好,但是框架布局搞砸了。 感谢您的阅读和任何帮助!
答案 0 :(得分:0)
我找到了一个解决方案: 我必须使用invalidate()函数,并覆盖ondraw()。
因此,以下链接将重绘并更新屏幕。它不会改变cv在framelayout中的任何内容。
public void onSensorChanged(SensorEvent event) {
dv.invalidate();
}
希望它有所帮助!