サーフェスビューの更新に問題があります。軽量の拡張現実アプリを作成したいので、背面にカメラプレビュー、前面に拡張サーフェスビューを備えたフレームレイアウトを作成しました。
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)でそれを呼び出すと、nullポインタ例外が発生しました。とにかく、この関数を常に呼び出すために、アクティビティにwhileループを設定しても大丈夫ですか?スレッドの方が良いと思いますが、フレームレイアウトが混乱します。読んでくれてありがとう!