在黑莓中滚动动态加载图像

时间:2010-03-25 12:51:27

标签: image blackberry java-me blackberry-storm

如何以黑莓屏幕上一次只显示一页的页面形式显示图像。向下滚动后续图像将在运行时加载。因此,加载图像不会在启动时消耗时间 编辑:我正在使用loadimage函数,该函数从黑莓设备内存加载图像,该图像从指定路径加载图像并调整其大小。随着图像数量的增加,它增加了窗口打开期间的启动时间。黑莓手机中的内置应用程序(媒体),图像加载时不需要额外的时间。我的想法是显示适合黑莓屏幕的特定数量的图像。 当用户向下滚动到屏幕底部时,应用程序将加载并显示更多图像。所以我的问题是如何检测用户何时到达黑莓屏幕底部并再显示一行图像。

1 个答案:

答案 0 :(得分:5)

保持图像数组网址和当前图像索引。将BitmapField放在屏幕上。添加下一个/上一个的菜单项。在下一步从递增的索引URL加载位图,将其设置为BitmapField并使屏幕无效。在Prev上做同样的减少索引。

  • 你也可以使用按钮(可能在风暴中),但菜单是强制性的
  • 在单独的线程中加载图像(特别是如果它们存储在Web中)
  • 您可以实施缓存(在应用内存中或通过在设备存储上保存图像)
  • 某些文字字段可能有用(文件名,类型,尺寸,尺寸等)

<强>更新 为此,您可以使用ScrollChangeListener

试试这段代码:

class Scr extends MainScreen implements ScrollChangeListener {
    static int mRowNumber = 0;

    public Scr() {
        getMainManager().setScrollListener(this);
            //preload some images on the start
        for (int i = 0; i < 20; i++) {
            mRowNumber = i;
            add(new BitmapField(downloadBitmap(), FOCUSABLE));

        }
    }

    public static Bitmap downloadBitmap() {
        Bitmap result = new Bitmap(200, 80);
        Graphics g = new Graphics(result);
        g.drawRect(0, 0, 200, 80);
        g.drawText("row #" + String.valueOf(mRowNumber), 30, 30);
        return result;
    }

    public void scrollChanged(final Manager manager, int newHorizontalScroll,
            int newVerticalScroll) {
        int testBottomScroll = manager.getVirtualHeight()
                - manager.getVisibleHeight();
        if (testBottomScroll == newVerticalScroll) {
            mRowNumber++;
            (new Thread(new Runnable() {
                public void run() {
                    // simulating download
                    Bitmap bitmap = downloadBitmap();
                    // update ui in thread safe way
                    addBitmap(bitmap);
                }
            })).start();
        }
    }

    public void addBitmap(final Bitmap bitmap) {
        UiApplication.getUiApplication().invokeLater(new Runnable() {
            public void run() {
                getMainManager().add(new BitmapField(bitmap, FOCUSABLE));
            }
        });
    }
}

PS这种方法的问题是,只有在屏幕上有足够的图像时,您才能捕捉滚动事件。然后考虑使用Screen.navigationMovement(int, int, int, int)。别忘了用拨轮和触摸屏测试它。

顺便说一句,我认为最好使用一些线程队列一次加载所有图像(因此图像将异步加载而不锁定ui)