FlexiPedia Wiki on Adobe Flex
Флэш Потрошитель - Жизнь вокруг технологииЖизнь вокруг технологии

Флэш Потрошитель этот | тот | 1.0

С 09.09.2002
  • Коллекция багов Flash
  • Ссылки для начинающего аниматора
  • Flex для PHP-разработчиков
  • Как вы используете Flash?

Поток сознания

polovaikin ответил на Что такое матрица:

флеш рипер уже не тот ;)

 
 

5 часов назад

Флэшер-аноним ответил на Что такое матрица:

Картинки можно дополнить текстом.

http://www.chemometrics.ru/materials/textbooks/matrix.htm

19 часов назад

makc3d ответил на Еще один способ заработать на играх:

ща потестим

1 день назад

Rost ответил на Еще один способ заработать на играх:

Fixed.

2 дня назад

7a ответил на BAFPUG revolution!:

Мы были на прошлой неделе в Белоруссии проездом, было очень холодно: ночью в Гомеле -32 %) Спасибо за приглашение, у меня есть сильное желание приехать и послушать доклады, интересные темы, но всё же в следующий раз, когда будет потеплее ;)

2 дня назад

Флэшер-аноним ответил на Релиз Alternativa3D 8.5.0 - с поддержкой GPU!:

Большое спасибо, очень интересно.

4 дня назад

Флэшер-аноним ответил на Cоздание мобильного Flash-приложения "Hello World" - урок для начинающих:

Наконец нашел что-то путное по теме. Начну разжевывать. Несколько дней уйдет, однако.

5 дней назад

Флэшер-аноним ответил на Избранные баги Flash:

Мне пришлось столкнуться с тем, что элементарно не работает комбинация клавиш Ctrl + C и Ctrl + V. Причем переустанавливали Flash и не раз. Может быть, есть здесь те, кто сталкивался с этой проблемой и как-то смог решить ее?

1 неделя назад

makc3d ответил на Избранные баги Flash:

beer good. spam bad!

1 неделя назад

Флэшер-аноним ответил на Избранные баги Flash:

Хотелось бы узнать, Как вы относитесь к пиву? Если положительно, то какое предпочитаете? Если отрицательно, то почему? Просто интересно...

1 неделя назад

Более старые 
Главная › Блоги › Блог Born

Особенности mx.preloaders.DownloadProgressBar

Проблема

В процессе разработки и тестирования была обнаружена одна неприятная особенность стандартного механизма инициализации flex-приложений. При нестабильном канале стандартный стартовый mx.preloaders.DownloadProgressBar вводит порой в заблуждение надписью Loading... и застрявшей на каком-то проценте полоской. При обрыве связи он зачастую не выводит никаких ошибок и продолжает благополучно сигнализировать Loading...

Задача

Дать понять пользу, что канал упал и загрузка стоит.

Ссылки

Алгоритм инициализации flex-приложения

Идеи

Попытки поймать Event об ошибке от contentLoaderInfo не увенчались успехом. Прокатило только под оперой с IOErrorEvent, если не изменяет память. Кроме того было замечено, что в единственном классе который можно модифицировать в стандартной инициализации mx.preloaders.DownloadProgressBar в protected хэндлер progressHandler продолжает валиться ProgressEvent, которая имеет поля bytesLoaded и bytesTotal. Поэтому возник вариант с динамическим контролем скорости скачивания swf-мувика и ответным действием на низкую или нулевую скорость.

Вариант решения

ExtDownloadProgressBar.as

public class ExtDownloadProgressBar extends DownloadProgressBar {

private var _refresh:Boolean = false;

// - флаг для обновления страницы только один раз

private var _lastBytes:uint = 0;

// - количество подгруженных байт, последнее значение

private var _lastDeltaBytes:int = 0;

// - разность подгруженных байт, последнее значение

private var _lastTime:int = 0;

// - время, последнее значение

public function ExtDownloadProgressBar () {
super();
_lastTime = getTimer();
}

// - засекаем начало отсчета

override protected function progressHandler(event:ProgressEvent):void {
super.progressHandler(event);
if (!_refresh) {

// - если не обновилось

if (_lastDeltaBytes != 0 && event.bytesLoaded == _lastBytes || event.bytesLoaded != _lastBytes) _lastTime = getTimer();

// - если последняя разность отлична от нуля и с прошлой прогресс-эвенты догрузки не было или была догрузка
// - то подвинуть начало отсчета

_lastDeltaBytes = event.bytesLoaded - _lastBytes;
_lastBytes = event.bytesLoaded;

// - обновляем разность байт и количество подгруженных байт

if ( _lastDeltaBytes == 0 && getTimer() - _lastTime > 15000 && event.bytesLoaded < event.bytesTotal) refresh();

// - если в этот прогрессевент ничего не догрузилось и 15 секунд ничего не загружалось
// - обновить страницу

}
}
private function refresh():void
{
if (ExternalInterface.available) {

// - если доступен внешний интерфейс

var href:String = ExternalInterface.call('getPageLocation');

// - спросим href текущей страницы

if (href != '') {

// - если он непустой

_refresh = true;

// - ставим флаг обновления

navigateToURL(new URLRequest(href),'_self');

// - обновляем страницу
}
}
}
}

preloader.js

function getPageLocation() {
return location.href;
}

Проверка

Эмбедим во флешку что-нибудь весомое (mp3 или jpg), меняем у Application.preloader на свой, добавляем preloader.js в код html-template запускаем проект. Во время скачки эмулируем обрыв связи и смотрим: через 15 секунд после обрыва связи, при поддержке JS в браузере страница перегружается.

ЗЫ

Сорри за кривую разметку as-кода Wink

  • download
  • flex
  • mxml
  • swf
  • Новости
- Born, вт, 05/05/2009 - 21:42
  • Блог пользователя Born
  • В Жуйк

Комментарии

Спасибо! Во флекс кукбук — однозначно! С переводом (и чем нужно) — помогу.

Rost - http://rajaka.net/ 11:45 06/05/09

Ммммм... Я не думал даже) Теперь подумаю)

Born 00:21 07/05/09

Да, хорошая идея. Я даже сразу это к себе взял в приложение Smile.

Толко пара замечаний
1. нет импортов
2. можно было обойтись и без дополнительного javascript файла.

А код получился у меня такой:
package ns.guicomps.preloader
{
import flash.events.ProgressEvent;
import flash.external.ExternalInterface;
import flash.net.URLRequest;
import flash.net.navigateToURL;
import flash.utils.getTimer;

import mx.preloaders.DownloadProgressBar;

public class Preloader extends DownloadProgressBar
{

private var _refresh:Boolean = false;

// - флаг для обновления страницы только один раз
private var _lastBytes:uint = 0;

// - количество подгруженных байт, последнее значение
private var _lastDeltaBytes:int = 0;

// - разность подгруженных байт, последнее значение
private var _lastTime:int = 0;

/**
* Тело JavaScript функции получения текущей страницы
*/
private var FUNCTION_GET_PAGE_LOCATION:String =
"document.insertScript = function ()" +
"{" +
"return location.href;"+
"}";

/**
* Конструтор
*/
public function Preloader()
{
super();
this.downloadingLabel = "Загружается...";
initializingLabel = "Инициализация...";
this.MINIMUM_DISPLAY_TIME = 2000;
this.label = "";
this.showPercentage = true;

_lastTime = getTimer();

}
override protected function showDisplayForInit(elapsedTime:int, count:int):Boolean
{
return true;
}
override protected function showDisplayForDownloading(elapsedTime:int, event:ProgressEvent):Boolean
{
return true;
}

// - засекаем начало отсчета
override protected function progressHandler(event:ProgressEvent):void
{
super.progressHandler(event);
if (!_refresh) // - если не обновилось
{

// - если последняя разность отлична от нуля и с прошлой прогресс-эвенты догрузки не было или была догрузка
// - то подвинуть начало отсчета

if (_lastDeltaBytes != 0 && event.bytesLoaded == _lastBytes || event.bytesLoaded != _lastBytes)
_lastTime = getTimer();

// - обновляем разность байт и количество подгруженных байт
_lastDeltaBytes = event.bytesLoaded - _lastBytes;
_lastBytes = event.bytesLoaded;

// - если в этот прогрессевент ничего не догрузилось и 15 секунд ничего не загружалось
// - обновить страницу

if ( _lastDeltaBytes == 0 && getTimer() - _lastTime > 15000 && event.bytesLoaded < event.bytesTotal)
refresh();
}

}

/**
* Обновляет страницу
*/
private function refresh():void
{
// - если доступен внешний интерфейс
if (ExternalInterface.available)
{
// - спросим href текущей страницы
var href:String = ExternalInterface.call(FUNCTION_GET_PAGE_LOCATION);

if (href)
{
// - если он непустой
_refresh = true;
// - ставим флаг обновления
navigateToURL(new URLRequest(href), '_self');
// - обновляем страницу
}
}
}
}
}

mmx (не проверено) 19:09 07/05/09
Примечания: Статус документа => в процессе ·
Статьи · Идеальный клип · Персоналии · Глоссарий (уст.) · Что делать? · К началу ↑
© 2002-2012 Ростиславр · О проекте · Подписка на RSS · α-тестировани невероятного
]]>
]]>
Что такое OpenID?
  • Войти по OpenID
  • Скрыть вход по OpenID
  • Регистрация
  • Запросить новый пароль