Blackberry - background image/animation RIM OS 4.5.0

后端 未结 1 636
天命终不由人
天命终不由人 2020-12-03 13:29

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

Thank You....

相关标签:
1条回答
  • 2020-12-03 13:42

    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

    0 讨论(0)
提交回复
热议问题