Blackberry – Загрузка / Ожидание экрана с анимацией

Есть ли способ показать экран «Загрузка» с анимацией в ежевике?

Опции:

  • Содержание анимации PME
  • multithreading + набор изображений + таймер / счетчик
  • стандартный обод api
  • каким-то другим способом

Любое из этого?

Благодаря!

Фермин, Энтони +1. Спасибо всем, ты дал мне часть ответа.
Мое окончательное решение:

1.Создайте или создайте анимацию GIF-генератора Ajax и добавьте ее в проект.

2.Создайте интерфейс ResponseCallback (см. Coderholic – Blackberry WebBitmapField ), чтобы получить результат выполнения streamа:

public interface ResponseCallback { public void callback(String data); } 

3. Создайте class для обработки задания фонового streamа. В моем случае это был http-запрос:

 public class HttpConnector { static public void HttpGetStream(final String fileToGet, final ResponseCallback msgs) { Thread t = new Thread(new Runnable() { public void run() { HttpConnection hc = null; DataInputStream din = null; try { hc = (HttpConnection) Connector.open("http://" + fileToGet); hc.setRequestMethod(HttpsConnection.GET); din = hc.openDataInputStream(); ByteVector bv = new ByteVector(); int i = din.read(); while (-1 != i) { bv.addElement((byte) i); i = din.read(); } final String response = new String(bv.toArray(), "UTF-8"); UiApplication.getUiApplication().invokeLater( new Runnable() { public void run() { msgs.callback(response); } }); } catch (final Exception e) { UiApplication.getUiApplication().invokeLater( new Runnable() { public void run() { msgs.callback("Exception (" + e.getClass() + "): " + e.getMessage()); } }); } finally { try { din.close(); din = null; hc.close(); hc = null; } catch (Exception e) { } } } }); t.start(); } } 

4.Create WaitScreen (гибрид FullScreen и AnimatedGIFField с интерфейсом ResponseCallback):

 public class WaitScreen extends FullScreen implements ResponseCallback { StartScreen startScreen; private GIFEncodedImage _image; private int _currentFrame; private int _width, _height, _xPos, _yPos; private AnimatorThread _animatorThread; public WaitScreen(StartScreen startScreen) { super(new VerticalFieldManager(), Field.NON_FOCUSABLE); setBackground( BackgroundFactory.createSolidTransparentBackground( Color.WHITE, 100)); this.startScreen = startScreen; EncodedImage encImg = GIFEncodedImage.getEncodedImageResource("ajax-loader.gif"); GIFEncodedImage img = (GIFEncodedImage) encImg; // Store the image and it's dimensions. _image = img; _width = img.getWidth(); _height = img.getHeight(); _xPos = (Display.getWidth() - _width) >> 1; _yPos = (Display.getHeight() - _height) >> 1; // Start the animation thread. _animatorThread = new AnimatorThread(this); _animatorThread.start(); UiApplication.getUiApplication().pushScreen(this); } protected void paint(Graphics graphics) { super.paint(graphics); // Draw the animation frame. graphics .drawImage(_xPos, _yPos, _image .getFrameWidth(_currentFrame), _image .getFrameHeight(_currentFrame), _image, _currentFrame, 0, 0); } protected void onUndisplay() { _animatorThread.stop(); } private class AnimatorThread extends Thread { private WaitScreen _theField; private boolean _keepGoing = true; private int _totalFrames, _loopCount, _totalLoops; public AnimatorThread(WaitScreen _theScreen) { _theField = _theScreen; _totalFrames = _image.getFrameCount(); _totalLoops = _image.getIterations(); } public synchronized void stop() { _keepGoing = false; } public void run() { while (_keepGoing) { // Invalidate the field so that it is redrawn. UiApplication.getUiApplication().invokeAndWait( new Runnable() { public void run() { _theField.invalidate(); } }); try { // Sleep for the current frame delay before // the next frame is drawn. sleep(_image.getFrameDelay(_currentFrame) * 10); } catch (InterruptedException iex) { } // Couldn't sleep. // Increment the frame. ++_currentFrame; if (_currentFrame == _totalFrames) { // Reset back to frame 0 // if we have reached the end. _currentFrame = 0; ++_loopCount; // Check if the animation should continue. if (_loopCount == _totalLoops) { _keepGoing = false; } } } } } public void callback(String data) { startScreen.updateScreen(data); UiApplication.getUiApplication().popScreen(this); } } 

5. В конце создайте экран «Начало», чтобы вызвать HttpConnector.HttpGetStream и показать WaitScreen:

 public class StartScreen extends MainScreen { public RichTextField text; WaitScreen msgs; public StartScreen() { text = new RichTextField(); this.add(text); } protected void makeMenu(Menu menu, int instance) { menu.add(runWait); super.makeMenu(menu, instance); } MenuItem runWait = new MenuItem("wait", 1, 1) { public void run() { UiApplication.getUiApplication().invokeLater( new Runnable() { public void run() { getFile(); } }); } }; public void getFile() { msgs = new WaitScreen(this); HttpConnector.HttpGetStream( "stackoverflow.com/faq", msgs); } //you should implement this method to use callback data on the screen. public void updateScreen(String data) { text.setText(data); } } 

UPDATE: другое решение naviina.eu: всплывающее всплывающее окно в стиле Web2.0 / Ajax в приложении BlackBerry

Основной шаблон для такого рода вещей:

У streamа есть цикл, который обновляет переменную (например, индекс кадра анимированного изображения), а затем вызывает недействительность на поле, которое рисует изображение (а затем спит в течение определенного периода времени). Недействительный будет стоять в очереди на перерисовку поля.

В методе рисования поля прочитайте переменную и нарисуйте соответствующий кадр изображения.

Псевдокод (не полностью полный, но чтобы дать вам идею):

 public class AnimatedImageField extends Field implements Runnable { private int currentFrame; private Bitmap[] animationFrames; public void run() { while(true) { currentFrame = (currentFrame + 1) % animationFrames.length; invalidate(); Thread.sleep(100); } } protected void paint(Graphics g) { g.drawBitmap(0, 0, imageWidth, imageHeight, animationFrames[currentFrame], 0, 0); } } 

Обратите внимание, что здесь я использовал массив битмапов, но EncodedImage позволяет обрабатывать анимированный gif как один объект и включает в себя методы для получения определенных кадров.

EDIT: Для полноты: добавьте это в PopupScreen (как в ответе Фермина) или создайте свой собственный диалог, перейдя непосредственно на экран. Отдельный stream необходим, потому что RIM API не является streamобезопасным: вам нужно сделать все, что связано с пользовательским интерфейсом в streamе событий (или, удерживая блокировку событий, см. Threading Threading BlackBerry – The Very Basics

Это простой код для загрузки экрана ….

  HorizontalFieldManager popHF = new HorizontalFieldManager(); popHF.add(new CustomLabelField("Pls wait...")); final PopupScreen waitScreen = new PopupScreen(popHF); new Thread() { public void run() { synchronized (UiApplication.getEventLock()) { UiApplication.getUiApplication().pushScreen(waitScreen); } //Here Some Network Call synchronized (UiApplication.getEventLock()) { UiApplication.getUiApplication().popScreen(waitScreen); } } }.start(); 

Если это просто анимация, вы можете показать анимированный gif во всплывающем окне и закрыть его, когда операция загрузки завершена?

Самый простой способ – это, вероятно, использовать стандартный GaugeField, установив стиль GaugeField.PERCENT. Это даст вам индикатор выполнения. Добавьте это в PopupScreen, и он будет сидеть поверх вашего контента. Что-то вроде..

 private GaugeField _gaugeField; private PopupScreen _popup; public ProgressBar() { DialogFieldManager manager = new DialogFieldManager(); _popup = new PopupScreen(manager); _gaugeField = new GaugeField(null, 0, 100, 0, GaugeField.PERCENT); manager.addCustomField(_gaugeField); } 

Затем используйте метод обновления, который будет использовать _gaugeField.setValue (newValue); для обновления индикатора выполнения.

Обычно я вызываю это из того, что нить выполняет работу (загрузка в вашем случае, всякий раз, когда операция завершена, индикатор выполнения обновляется.

Я бы предложил взглянуть на эту простую реализацию. Мне это нравилось, но я никогда не использовал его. Может быть полезно для вас.

текст ссылки

ActivityIndicator – хороший вариант, если вы работаете как минимум с BB OS 6.0.

http://www.brighthub.com/mobile/blackberry-platform/articles/94258.aspx

http://docs.blackberry.com/en/developers/deliverables/17966/Screen_APIs_1245069_11.jsp

  • Объявление пользовательского элемента пользовательского интерфейса Android с использованием XML
  • Обновление пользовательского интерфейса из streamа
  • iPhone: скрыть панель поиска UITableView по умолчанию
  • Как я могу улучшить внешний вид приложения для Android?
  • Переместить макеты, когда отображается мягкая клавиатура?
  • создание зачеркнутого текста?
  • Рамки графического интерфейса Java. Что выбрать? Swing, SWT, AWT, SwingX, JGoodies, JavaFX, Apache Pivot?
  • Анимировать обновление ProgressBar в Android
  • Как установить фоновое изображение в JPanel
  • SwingWorker, Thread.sleep () или javax.swing.timer? Мне нужно «вставить паузу»,
  • Почему мы должны использовать sp для размеров шрифтов в Android?
  • Interesting Posts

    Как создать две строки нижнего колонтитула в jqgrid

    IE 10 сбой при загрузке файла при использовании EMET

    Как перечислить все свойства зависимостей управления?

    Обновление синтаксиса кэшированных данных CSS

    Как я могу использовать Teamviewer анонимно с сетью TOR?

    Элемент или class LIKE для jQuery?

    Найти элемент управления по имени из элементов управления Windows Forms

    Как получить высоту кнопки, чтобы соответствовать высоте другого элемента?

    Может ли локальный провайдер захватить мое местоположение всякий раз, когда я запускаю VPN на VPN-сервер?

    Точность десятичного деления T-SQL

    В каратэ, как мы можем совместно работать с BA для автоматизации бизнес-сценариев

    Изменить и продолжить: «Изменения не допускаются, когда …»

    Загрузка файлов в Ubuntu делает их «разделяемыми» в Vista

    Сначала вызовите removeView () родителя ребенка

    Unicode, UTF, ASCII, различия формата ANSI

    Давайте будем гением компьютера.