загружать изображения динамически при прокрутке в BlackBerry - PullRequest
1 голос
/ 25 марта 2010

Как отображать изображения в виде страниц, на которых одновременно отображается только одна страница на экране ежевики. При прокрутке вниз последующие изображения будут загружаться во время выполнения. Чтобы загрузка изображений не занимала время при запуске.
Редактировать: Я использую функцию loadimage, которая загружает изображения из памяти устройства Blackberry, которая загружает изображения по указанному пути и изменяет их размер. По мере увеличения количества изображений увеличивается время запуска при открытии окна. - встроенное приложение (Media) в телефоне Blackberry, где изображения загружаются без лишнего времени. Моя идея состоит в том, чтобы отображать определенное количество изображений, которые соответствуют экрану Blackberry. Когда пользователь прокручивает экран до нижней части экрана, приложение затем загружает и отображает больше изображений. Поэтому мой вопрос заключается в том, как определить, когда пользователь достиг нижней части экрана Blackberry, и отобразить еще одну строку изображений.

1 Ответ

5 голосов
/ 25 марта 2010

Сохранить массив изображений URL и текущий индекс изображения. Поместите BitmapField на экран. Добавьте пункты меню для Next / Prev. При следующей загрузке растрового изображения из увеличенного URL-адреса индекса установите для него значение BitmapField и отключите экран. В предыдущей сделайте то же самое с уменьшенным индексом.

  • Вы также можете использовать кнопку (возможно, в шторм), но меню обязательно
  • загрузка изображений в отдельных потоках (особенно если они хранятся в сети)
  • Вы можете реализовать кэширование (в памяти приложения или путем сохранения изображений на устройстве хранения)
  • некоторые текстовые поля могут быть полезны (имя файла, тип, размер, размеры и т. Д.)

UPDATE Для этого вы можете использовать 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) затем. И не забудьте протестировать его с помощью треквила и сенсорного экрана.

Кстати, я считаю, что было бы лучше загрузить все изображения одновременно, используя некоторую очередь потоков (таким образом, изображения будут загружаться асинхронно без блокировки интерфейса пользователя)

...