Java 来自blackberry知识库的AnimatedGIFField,don';我不知道如何操作gif
我正在使用这个代码,如果有人熟悉它,它来自黑莓知识库。不管怎样,我想知道如何使用这个类操纵GIF。我可以在屏幕上看到gif,但它不断重复,不会消失。非常感谢您的帮助 公共类AnimatedGIFField扩展了位图字段 { private GIFEncodedImage _image;//要绘制的图像。 private int _currentFrame;//中的当前帧 动画序列。 private int _width;//图像的宽度 (背景框)。 private int _height;//图像的高度 (背景框)。 私有animatorhread_animatorhreadJava 来自blackberry知识库的AnimatedGIFField,don';我不知道如何操作gif,java,blackberry,animated-gif,Java,Blackberry,Animated Gif,我正在使用这个代码,如果有人熟悉它,它来自黑莓知识库。不管怎样,我想知道如何使用这个类操纵GIF。我可以在屏幕上看到gif,但它不断重复,不会消失。非常感谢您的帮助 公共类AnimatedGIFField扩展了位图字段 { private GIFEncodedImage _image;//要绘制的图像。 private int _currentFrame;//中的当前帧 动画序列。 private int _width;//图像的宽度 (背景框)。 private int _height;//图
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);
//Don't redraw the background if this is the first frame.
if (_currentFrame != 0)
{
//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()
{
_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;
}
}
}
}
}
}不要叫
super.paint(图形)
,而是自己画所有需要画的东西。重新编写绘制(图形)
方法,如下所示:
private boolean isPaint = true;
protected void paint(Graphics graphics) {
if(!isPaint) return;
// super.paint(graphics);
if (_currentFrame == _image.getFrameCount()-1) {
graphics.setGlobalAlpha(0);
isPaint = false;
}
graphics.drawImage(
_image.getFrameLeft(_currentFrame),
_image.getFrameTop(_currentFrame),
_image.getFrameWidth(_currentFrame),
_image.getFrameHeight(_currentFrame), _image,
_currentFrame, 0, 0
);
}
可能重复的