1

サーフェスビューの更新に問題があります。軽量の拡張現実アプリを作成したいので、背面にカメラプレビュー、前面に拡張サーフェスビューを備えたフレームレイアウトを作成しました。

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ループを設定しても大丈夫ですか?スレッドの方が良いと思いますが、フレームレイアウトが混乱します。読んでくれてありがとう!

4

1 に答える 1

1

私は解決策を見つけました:

invalidate()関数を使用して、ondraw()メソッドをオーバーライドする必要があります。

したがって、次のリンクは画面を再描画して更新します。cvがaにあることは何も変わりませんFramelayout

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

それが誰かを助けることを願っています!

于 2013-01-02T10:02:33.013 に答える