views:

2215

answers:

1

Please help me, how to set a background image for screen and How to do animations on any-field or on text?

Thank You....

+7  A: 

Background image

In Screen class there is a protected void paintBackground(Graphics graphics) method.
By some reason we can't use it directly to paint background image in screen. The catch: paintBackground method is derived from Field class, and we can use it in VerticalFieldManager on example:

class BgScreen extends MainScreen implements FieldChangeListener {
 ButtonField mButton;
 public BgScreen(Bitmap background) {
  super();
  BGVerticalFieldManager manager = 
   new BGVerticalFieldManager(background);
  add(manager);
  mButton = new ButtonField("Button", ButtonField.CONSUME_CLICK);
  mButton.setChangeListener(this);
  manager.add(mButton);
 }

 public void fieldChanged(Field field, int context) {
  if (mButton == field)
   Dialog.inform("You pressed button");
 }
}

class BGVerticalFieldManager extends VerticalFieldManager {
 Bitmap mBgBitmap = null;
 int mBgWidth = -1;
 int mBgHeight = -1;
 int mBgX = -1;
 int mBgY = -1;

 public BGVerticalFieldManager(Bitmap background) {
  super(USE_ALL_WIDTH | USE_ALL_HEIGHT);
  mBgBitmap = background;
  mBgWidth = mBgBitmap.getWidth();
  mBgHeight = mBgBitmap.getHeight();
  mBgX = (Display.getWidth() - mBgWidth) >> 1;
  mBgY = (Display.getHeight() - mBgHeight) >> 1;

 }

 protected void paintBackground(Graphics graphics) {
  paintBackgroundBitmap(graphics);
  super.paintBackground(graphics);
 }

 private void paintBackgroundBitmap(Graphics graphics) {
  if (null != mBgBitmap) {
   graphics.drawBitmap(
    mBgX, mBgY, mBgWidth, mBgHeight, mBgBitmap, 0, 0);
  }
 }
}

GIF animation

To use GIF animation, override protected void paint(Graphics graphics) method and use drawImage of incremented frame index. Use Timer.scheduleAtFixedRate to invalidate field:

class GIFVerticalFieldManager extends VerticalFieldManager {
    EncodedImage mGIFImage = null;
    int mGIFWidth = -1;
    int mGIFHeight = -1;
    int mGIFX = -1;
    int mGIFY = -1;
    int mGIFFrameCount = -1;
    int mGIFFrameIndex = -1;
    final int mGIFDelay = 30;

    public GIFVerticalFieldManager(EncodedImage gifAnimation) {
     super(USE_ALL_WIDTH | USE_ALL_HEIGHT);
     mGIFImage = gifAnimation;
     mGIFWidth = mGIFImage.getWidth();
     mGIFHeight = mGIFImage.getHeight();
     mGIFX = (Display.getWidth() - mGIFWidth) >> 1;
     mGIFY = (Display.getHeight() - mGIFHeight) >> 1;
     mGIFFrameCount = mGIFImage.getFrameCount();
     mGIFFrameIndex = 0;

     Timer timer = new Timer();
     timer.scheduleAtFixedRate(new TimerTask() {
      public void run() {
       invalidate();
      }
     }, mGIFDelay, mGIFDelay);
    }

    protected void paint(Graphics graphics) {
     paintGifAnimation(graphics);
     super.paint(graphics);
    }

    private void paintGifAnimation(Graphics graphics) {
     if (null != mGIFImage) {
      graphics.drawImage(
       mGIFX, mGIFY, mGIFWidth, mGIFHeight, 
   mGIFImage, mGIFFrameIndex, 0, 0);
      mGIFFrameIndex++;
      if (mGIFFrameIndex > mGIFFrameCount - 1)
       mGIFFrameIndex = 0;
     }
    }
}

EDIT: Great article - Direct Screen Drawing

Max Gontar
Thanks Coldice, its very helpful. Thanks once again.
Jessu
You're welcome!
Max Gontar
@Max: This is an excellent answer, I would recommend splitting this insto two separate questions to make it easier to find. Create a new question, cut the bottom half into that and edit the original question. Would do it myself, but I'm still a few hundred rep short.
Casebash