0

別のチュートリアルの最初のコードをパターン化して、SurfaceViewへの描画を処理するクラスを作成しました。このチュートリアル(および私が見つけた他のチュートリアル)は、xmlで定義されたSurfaceViewを、アクティビティの作成時に開始するクラスに関連付けます。私の目標は、レイアウト内のボタンを押すとxmlで定義されたサーフェスビューでアニメーションを開始し、もう一度押すと終了することです。

さらに、アニメーションは、(表示全体ではなく)xmlで指定した領域内で実行する必要があります。

簡単にするために、現在、レイアウトを機能させる方法を理解するまで、サーフェスビューに円を描画しているだけです。

したがって、[移動]ボタン(BattleActivity :: onClick)をクリックすると、サーフェスビューが作成および描画されますが、ボタンを含むレイアウト内の他のコントロールをカバーするディスプレイ全体が表示されます。レイアウトの一部として定義されたサーフェスビュー(id = batchView)でのみアニメーションを実行したい。

これが私のXMLレイアウトコード(tabBattle.xml)のサブセクションです。

<LinearLayout
    android:orientation="vertical"
    android:gravity="center"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <SurfaceView
        android:id="@+id/battleView"
        android:layout_weight="70"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center_horizontal"/>        

    <Button
        android:onClick="onClick"
        android:text=" Go "
        android:gravity="center"
        android:layout_weight="30"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

これが私の主な活動クラスです。これは、レイアウト(tabBattle)が存在するタブビューに移動したときに作成されます。Goボタンを押すとonClickが呼び出されます。onClickでの私の意図は、サーフェスビューを取得し、新しいBattleViewインスタンスを作成し、サーフェスビューコンテキストをBattleViewコンストラクターに渡すことです。これは明らかに正しくありませんが、他にこれを行う方法がわかりません。

public class BattleActivity extends Activityimplements View.OnClickListener {@Override public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState); setContentView(R.layout.tabbattle); }

@Override
public void onClick(View v)
{
    SurfaceView battleSurface = (SurfaceView)findViewById(R.id.battleView);
    setContentView(new BattleView( battleSurface.getContext() ));
}

}

SurfaceViewサブクラス:

public class BattleView extends SurfaceViewimplements SurfaceHolder.Callback {private int circleRadius; プライベートペイントcirclePaint; UpdateThreadBattle updateThread;

private int width;
private int height;
private int xPos;
private int yPos;
private int xVel;
private int yVel;

public BattleView(Context context)
{
    super(context);
    getHolder().addCallback(this);

    circleRadius = 10;
    circlePaint = new Paint();
    circlePaint.setColor(Color.BLUE);

    xVel = 2;
    yVel = 2;       
}

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawColor(Color.WHITE);
    canvas.drawCircle(xPos, yPos, circleRadius, circlePaint);
}


@Override
public void surfaceCreated(SurfaceHolder holder)
{
    Rect surfaceFrame = holder.getSurfaceFrame();
    width = surfaceFrame.width();
    height = surfaceFrame.height();

    xPos = width / 2;
    yPos = circleRadius;

    updateThread = new UpdateThreadBattle(this);
    updateThread.setRunning(true);
    updateThread.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder arg0)
{
    boolean retry = true;

    updateThread.setRunning(false);

    while (retry) {
        try {
            updateThread.join();
            retry = false;
        } catch (InterruptedException e) {

        }
    }
}

@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
    // TODO Auto-generated method stub

}

}

おそらくお気づきかもしれませんが、私は一般的にandroidとjavaに不慣れです。どんな助けでも大歓迎です!

グレッグ

4

1 に答える 1

0

私が選択した最終的な解決策は、スレッドベースのサーフェス アニメーションを実装するのではなく、タイマーを利用することでした。質問を書いた時点では、タイマーについて知りませんでした。それはうまく機能します、brw!

于 2011-04-18T19:11:07.227 に答える