Android 如何通过按下按钮启动xml定义的曲面视图?
我已经模仿了另一个教程中的初始代码,创建类来处理SurfaceView的绘图。本教程(以及我发现的其他教程)将xml定义的SurfaceView与创建活动时初始化的类相关联。我的目标是在按下布局中的按钮时在xml定义的曲面视图中启动动画,并在再次按下按钮时终止动画 此外,动画必须在我在xml中指定的区域内运行(而不是整个显示) 为了简单起见,我目前只在surfaceview中画一个圆,直到我知道如何使布局工作 因此,当我单击Go按钮(BattleActivity::onClick)时,会创建并绘制曲面视图,但它会填充整个显示,覆盖布局中的其他控件,包括按钮。我希望动画仅在定义为布局的一部分的曲面视图中发生(id=battleView) 下面是我的XML布局代码(tabBattle.XML)的一个子部分 } SurfaceView子类: 公共类BattleView扩展了SurfaceView,实现了SurfaceHolder.Callback { 私家车; 私人油漆; UpdateThreadBattle updateThreadAndroid 如何通过按下按钮启动xml定义的曲面视图?,android,xml,surfaceholder,Android,Xml,Surfaceholder,我已经模仿了另一个教程中的初始代码,创建类来处理SurfaceView的绘图。本教程(以及我发现的其他教程)将xml定义的SurfaceView与创建活动时初始化的类相关联。我的目标是在按下布局中的按钮时在xml定义的曲面视图中启动动画,并在再次按下按钮时终止动画 此外,动画必须在我在xml中指定的区域内运行(而不是整个显示) 为了简单起见,我目前只在surfaceview中画一个圆,直到我知道如何使布局工作 因此,当我单击Go按钮(BattleActivity::onClick)时,会创建并绘
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
}