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

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

Опции:

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

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

Благодаря!

7 Solutions collect form web for “Blackberry – Загрузка / Ожидание экрана с анимацией”

Фермин, Энтони +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)
  • Слушатель модели JTable слишком быстро обнаруживает вставленные строки (до их рисования)
  • Qt сигнализирует по streamам, один - stream GUI?
  • MATLAB: как отображать текст в кодировке UTF-8, считанный из файла?
  • Как установить фоновое изображение в JPanel
  • Неверная операция поперечного streamа
  • paintComponent () vs paint () и JPanel vs Canvas в графическом интерфейсе типа кисти
  • Эффект JavaFX на фоне
  • Объявление пользовательского элемента пользовательского интерфейса Android с использованием XML
  • GUI не работает после перезаписи в MVC
  • Пользовательские заголовки / хром в приложении WinForms
  • Interesting Posts

    Почему диапазон байтов от -128 до 127 в Java?

    Работа с несколькими книгами в Excel 2013

    Как открыть URL-адрес по расписанию в браузере по умолчанию?

    JTable повторяющиеся значения в строке

    Как продолжить выполнение, когда Assertion failed

    Как я могу сделать программу навсегда запущенной как администратор, когда отсутствует вкладка Совместимость?

    Как я могу заменить функцию кнопки выключения на спящий режим?

    Как я могу подсчитать уникальные значения, разделенные запятыми, в Excel 2010

    gfortran для макетов: что делает mcmodel = medium?

    java.text.ParseException: Непревзойденная дата

    Как отслеживать изменения содержимого буфера обмена в C #?

    Могу ли я тестировать SmtpClient перед вызовом client.Send ()?

    Как моделировать систему голосования «любит» с помощью MongoDB

    Как реализовать сериализацию в C ++

    Наружная топология сетки WiFi против ретрансляторов

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