【问题标题】:load images dynamically on scroll in blackberry在黑莓中滚动动态加载图像
【发布时间】:2010-03-26 18:43:51
【问题描述】:

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

【问题讨论】:

    标签: image blackberry java-me blackberry-storm


    【解决方案1】:

    保留图像 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 的情况下异步加载)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多