当前位置: 代码迷 >> BlackBerry >> Blackberry 下显示动态 GIF 图片
  详细解决方案

Blackberry 下显示动态 GIF 图片

热度:10891   发布时间:2013-02-26 00:00:00.0
Blackberry 上显示动态 GIF 图片
主类是在外国网站上看的,忘了是哪个网站了。直接上主类的代码
package com.doll.decodegif;import net.rim.device.api.ui.UiApplication;import net.rim.device.api.ui.XYRect;import net.rim.device.api.system.GIFEncodedImage;import net.rim.device.api.ui.Graphics;import net.rim.device.api.ui.component.BitmapField;//A field that displays an animated GIF.public class AnimatedGIFField extends BitmapField {    private GIFEncodedImage _image;     //The image to draw.    private int _currentFrame;          //The current frame in the animation sequence.    private int _width;                 //The width of the image (background frame).    private int _height;                //The height of the image (background frame).    private AnimatorThread _animatorThread;        public AnimatedGIFField(GIFEncodedImage image)    {        this(image, 0);    }        public AnimatedGIFField(GIFEncodedImage image, long style)    {        //Call super to setup the field with the specified style.        //The image is passed in as well for the field to configure its required size.        super(image.getBitmap(), style);                //Store the image and it's dimensions.        _image = image;        _width = image.getWidth();        _height = image.getHeight();                //Start the animation thread.        _animatorThread = new AnimatorThread(this);        _animatorThread.start();    }        protected void paint(Graphics graphics)    {        //Call super.paint.  This will draw the first background frame and handle any required focus drawing.        super.paint(graphics);        graphics.clear(this.getExtent());        //Don't redraw the background if this is the first frame.        if (true)        {            //Draw the animation frame.            graphics.drawImage(_image.getFrameLeft(_currentFrame), _image.getFrameTop(_currentFrame),                 _image.getFrameWidth(_currentFrame), _image.getFrameHeight(_currentFrame), _image, _currentFrame, 0, 0);        }    }        //Stop the animation thread when the screen the field is on is    //popped off of the display stack.    protected void onUndisplay()    {        _animatorThread.stop();        super.onUndisplay();    }           //A thread to handle the animation.    private class AnimatorThread extends Thread    {        private AnimatedGIFField _theField;        private boolean _keepGoing = true;              private int _totalFrames;               //The total number of frames in the image.        private int _loopCount;                 //The number of times the animation has looped (completed).        private int _totalLoops;                //The number of times the animation should loop (set in the image).        public AnimatorThread(AnimatedGIFField theField)        {            _theField = theField;            _totalFrames = _image.getFrameCount();            _totalLoops = _image.getIterations();                    }                public synchronized void stop()        {            _keepGoing = false;        }                public void run()        {        	            while(_keepGoing)            {                //Invalidate the field so that it is redrawn.                UiApplication.getUiApplication().invokeAndWait(new Runnable()                 {                    public void run()                     {                    	//UiApplication.getUiApplication().getActiveScreen().invalidate();                        _theField.invalidate();                                               }                });                                                try                {                    //Sleep for the current frame delay before the next frame is drawn.                    sleep(_image.getFrameDelay(_currentFrame) * 10);                }                catch (InterruptedException iex)                {} //Couldn't sleep.                                //Increment the frame.                ++_currentFrame;                                      if (_currentFrame == _totalFrames)                {                    //Reset back to frame 0 if we have reached the end.                    _currentFrame = 0;                                        ++_loopCount;                                        //Check if the animation should continue.                    if (_loopCount == _totalLoops)                    {                        _keepGoing = false;                    }                }            }        }    }}


附件里面是解析GIF图片的一个Demo工程 (这是在Eclipse上的 在BB自己的IDE里面我也测试过了)
  相关解决方案