0

我已经从另一个教程中对我的初始代码进行了模式化,以创建类来处理对 SurfaceView 的绘图。本教程(以及我发现的其他教程)将 xml 定义的 SurfaceView 与在创建活动时启动的类相关联。我的目标是在我的布局中按下按钮时在 xml 定义的表面视图中启动动画,并在我再次按下它时终止它。

此外,动画必须在我在 xml 中指定的区域内运行(而不是整个显示)。

为简单起见,我目前只在表面视图中绘制一个圆圈,直到我弄清楚如何让我的布局正常工作。

因此,当我单击 Go 按钮 (BattleActivity::onClick) 时,我的表面视图被创建和绘制,但它填充了整个显示,覆盖了我的布局中的其他控件,包括按钮。我希望动画只发生在定义为我的布局一部分的表面视图中(id=battleView)。

这是我的 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 构造函数。这显然是不正确的,但我不知道该怎么做。

公共类 BattleActivity 扩展 Activity 实现 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 子类:

公共类 BattleView 扩展 SurfaceView 实现 SurfaceHolder.Callback { private int circleRadius; 私人油漆圈油漆;更新线程战更新线程;

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 回答