1

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

4

1 回答 1

5

保留图像 url 和当前图像索引的数组。在屏幕上放置一个 BitmapField。为 Next/Prev 添加菜单项。在 Next 从递增的索引 url 加载 Bitmap 时,将其设置为 BitmapField 并使屏幕无效。在 Prev 上对递减的索引执行相同的操作。

  • 您也可以使用按钮(可能在风暴中),但菜单是强制性的
  • 在单独的线程中加载图像(特别是如果它们存储在网络中)
  • 您可以实现缓存(在应用程序内存中或通过将图像保存在设备存储中)
  • 某些文本字段可能会有所帮助(文件名、类型、大小、尺寸等)

更新 为此,您可以使用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 的情况下异步加载)

于 2010-03-25T13:32:00.657 回答