1

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

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

  • 创建一个新的动画场并尝试替换它IllegalArgumentException...... (我正在尝试从内部更改它Thread,使用invokeLater()...我也使用invokeAndWait()过)

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

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

有任何想法吗?

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

4

1 回答 1

1

如果您使用的是 6.0(或更高版本)的最低 BlackBerry OS,则BitmapField该类直接支持动画 gif

如果您需要支持较低的操作系统版本,那么您只需要在您的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该类的工作方式并不是很好的多线程实践(用于停止线程)。如果你真的想让代码更好,你可以实现这个解决方案,或者 使用我在这个答案中展示的技术

在此处阅读有关此内容的更多信息

于 2013-04-29T23:29:22.393 回答