[android-developers] How do I initiate/terminate xml-defined SurfaceView upon a button push?
Hello, I've patterned my initial code from another tutorial to create classes to handle drawing to a SurfaceView. This tutorial (and others I've found) associate an xml-defined SurfaceView to a class which intiates upon creation. My goal is to initiate animation in an xml-defined surface view upon pushing a button in my layout and terminating it when I push it again. Furthermore, the animation must run inside the region I've specified in my xml (rather than the entire display) confined to that region and not disturb the other widgets on the layout. For simplicity, I'm currently only drawing a circle in the surfaceview until I figure out how to get my layout working. So, when I click the Go button (BattleActivity::onClick), my surface view is created and drawn, but it fills the entire display covering the other controls in my layout including the button. I want the animation to take place only in the surface view defined as part of my layout (id=battleView). Here's a sub-layout section of my XML code (tabBattle.xml). Here's my main activity class. This is created when I navigate to the tab view where its layout (tabBattle) resides. The onClick is called when I push the Go button. My intention in onClick is to get the surface view, create a new BattleView instance, and and pass the surface view context to the BattleView constructor. Based on my tests, this clearly is not correct but I have no idea how else to accomplish my goal. public class BattleActivity extends Activity implements 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 subclass: public class BattleView extends SurfaceView implements SurfaceHolder.Callback { private int circleRadius; private Paint 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); } @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(); // do stuff herre 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) { } } } } Any help is greatly appreciated! Greg -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en
[android-developers] How do I initiate/terminate xml-defined SurfaceView upon a button push?
Hello, I'm trying to initiate an animation to run in a specific xml-defined view with a button push. Currently It runs when I push the button but but the animation uses the entire display, covering all of the other widgets including the button used to start it. The info and examples I've found all demmonstrate how to display animation in the full screen upon startup of the layout activity. My goal is to initiate animation in an xml-defined surface view that resides INSIDE the layout. On other platforms I would simply create a timer (initiated and/or terminated by the button push) in the ui thread which does the animation in slices. Is there any concept like that in android? Anyways, in the onClick method I get the surface view using the id specified in the xml. I then create my surface view object and pass the context of the surface view. Alas, this doesn't work. Here's a sub-layout section of my XML code (tabBattle.xml). Here's my main activity class. This is created when I navigate to the tab view where its layout (tabBattle) resides. The onClick is called when I push the Go button. My intention in onClick is to get the surface view, create a new BattleView instance, and and pass the surface view context to the BattleView constructor. This clearly is not correct but I have no idea how else to accomplish my goal. public class BattleActivity extends Activity implements 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 subclass: public class BattleView extends SurfaceView implements SurfaceHolder.Callback { private int circleRadius; private Paint 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) { // you can always experiment by removing this line if you wish! 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 } } I would appreciate ANY help here. Thanks! Greg -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en