Android 如何通过按下按钮启动xml定义的曲面视图?

Android 如何通过按下按钮启动xml定义的曲面视图?,android,xml,surfaceholder,Android,Xml,Surfaceholder,我已经模仿了另一个教程中的初始代码,创建类来处理SurfaceView的绘图。本教程(以及我发现的其他教程)将xml定义的SurfaceView与创建活动时初始化的类相关联。我的目标是在按下布局中的按钮时在xml定义的曲面视图中启动动画,并在再次按下按钮时终止动画 此外,动画必须在我在xml中指定的区域内运行(而不是整个显示) 为了简单起见,我目前只在surfaceview中画一个圆,直到我知道如何使布局工作 因此,当我单击Go按钮(BattleActivity::onClick)时,会创建并绘

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

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

为了简单起见,我目前只在surfaceview中画一个圆,直到我知道如何使布局工作

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

下面是我的XML布局代码(tabBattle.XML)的一个子部分

}

SurfaceView子类:

公共类BattleView扩展了SurfaceView,实现了SurfaceHolder.Callback { 私家车; 私人油漆; 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基本上是新手。非常感谢您的帮助


Greg

我选择的最终解决方案是使用计时器,而不是实现基于线程的曲面动画,这对于我在视图中需要的简单动画来说是过分的。在我写问题的时候,我不知道计时器。它工作得很好,brw

@Override
public void onClick(View v)
{
    SurfaceView battleSurface = (SurfaceView)findViewById(R.id.battleView);
    setContentView(new BattleView( battleSurface.getContext() ));
}
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

}