黑莓java,刷新自定义动画横幅

时间:2013-04-29 16:37:50

标签: blackberry java-me gif animated-gif

我想在我的应用顶部显示.gif横幅。我正在使用此代码来显示动画字段BB Animated GIF Field。问题是我想每分钟刷新这个横幅。我尝试了很多东西:

  • 创建一个新对象,但这不会更改横幅。

  • 创建一个新的动画字段并尝试替换它.... IllegalArgumentException。 (我正在尝试使用ThreadinvokeLater()内部更改...我也使用了invokeAndWait()

  • 删除此动画字段并添加一个新字段(来自invokeLater()invokeAndWait() - > IllegalException

  • 将位图设置为此字段。第一个动画没有显示,我可以看到来自另一个横幅的图像,但它没有动画。

有什么想法吗?

如果您需要查看一些代码,我会尝试明天发布。

1 个答案:

答案 0 :(得分:1)

如果您使用的是6.0(或更高版本)的最低BlackBerry OS,则为BitmapField课程directly supports animated gifs

如果您需要支持较低的操作系统版本,那么您只需要在AnimatedGIFField类中添加一个方法来换出旧图像,并使用新图像:

public void setImage(EncodedImage image) {
    // Call BitmapField#setImage()
    super.setImage(image);

    // Store the image and its dimensions.
    _image = image;
    _width = image.getWidth();
    _height = image.getHeight();
    _currentFrame = 0;

    // Stop the previous thread.
    _animatorThread.stop();

    // Start a new animation thread.
    _animatorThread = new AnimatorThread(this);
    _animatorThread.start();
}

请注意,这是一个UI操作。因此,如果要从后台线程更新映像,请确保使用将其置于UI线程的调用来包装它。例如:

 final EncodedImage eImage = EncodedImage.getEncodedImageResource("img/banner.gif");
 UiApplication.getUiApplication().invokeLater(new Runnable() {
     public void run() { 
         _animatedBanner.setImage(eImage);
     }
 });

更新:我还注意到AnimatedGIFField类的工作方式不是很好的多线程练习(用于停止线程)。如果你真的想让代码变得更好,你可以implement this solution或者 use the technique I show in this answer

阅读more about this here