19 часов назадКартинки можно дополнить текстом.
http://www.chemometrics.ru/materials/textbooks/matrix.htm
2 дня назадМы были на прошлой неделе в Белоруссии проездом, было очень холодно: ночью в Гомеле -32 %) Спасибо за приглашение, у меня есть сильное желание приехать и послушать доклады, интересные темы, но всё же в следующий раз, когда будет потеплее ;)
5 дней назадНаконец нашел что-то путное по теме. Начну разжевывать. Несколько дней уйдет, однако.
1 неделя назадМне пришлось столкнуться с тем, что элементарно не работает комбинация клавиш Ctrl + C и Ctrl + V. Причем переустанавливали Flash и не раз. Может быть, есть здесь те, кто сталкивался с этой проблемой и как-то смог решить ее?
1 неделя назадХотелось бы узнать, Как вы относитесь к пиву? Если положительно, то какое предпочитаете? Если отрицательно, то почему? Просто интересно...
Проблема
В процессе разработки и тестирования была обнаружена одна неприятная особенность стандартного механизма инициализации 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-кода 

Комментарии
Спасибо! Во флекс кукбук — однозначно! С переводом (и чем нужно) — помогу.
Ммммм... Я не думал даже) Теперь подумаю)
Да, хорошая идея. Я даже сразу это к себе взял в приложение
.
Толко пара замечаний
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');
// - обновляем страницу
}
}
}
}
}