После долгих мучений и попыток установить курсор в виде пальца над лейблом – родилось такое решение:
useHandCursor = true;
mouseChildren = false;
buttonMode = true;
По-другому оно никак не хотело работать. Мудотатство.
Здравствуйте, уважаемые любители этого интересного. Сегодня мы разберем вопрос поддержки сжатия GZip флеш-плеером.
Дело в том, что при работе с большими объемами данных (приём-пересылка) бывает необходимо архивировать данные сервером при пересылке клиенту. На уровне HTML поддержка GZip браузерами реализована на 5 баллов.
Как это работает?
Клиент запрашивает у сервера данные. К примеру, сервер решил, что текстовых данных аж 2 мегабайта. Пока вы дождетесь пересылки их от сервера клиенту – яйца седыми станут. Поэтому сервер упаковывает их в формат GZip, пересылает клиенту 30 килобайт данных, а клиент за секунду разархивирует их в нужные нам 2 мегабайта текстовой информации.
Сразу оговорюсь как это работает в различных условиях.
Flash IDE – никак. Нужно подключать сторонние библиотеки для чтения GZip формата.
И постоянно слать заголовок ‘Accept-Encoding’:'gzip’. Принимаемые данные будут нечитаемыми.
При публикации и просмотре AIR или EXE файла – все работает на ура. Но! Длина принимаемых данных определяется неверно. То есть фактически длина принятых данных во много раз превышает общую длину данных. Поэтому в обработчике URLLoaderа ProgressEvent.PROGRESS можно получить и 400 и 1000% принимаемых данных.
Как это исправить? Серверу необходимо отправлять клиенту Air дополнительный заголовок.
К примеру назовём его: public static const AIR_CONTENT_LENGTH:String = ‘Air-Content-Length’;
Затем посмотрим что приходит от сервера:
myURLLoader.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, onHTTPResponseStatus);
private var total_response_length:Number = 0;
//получаем заголовки сервера
private function onHTTPResponseStatus(e:HTTPStatusEvent):void
{
var isHeaderPresent:Boolean = false;
for (var i:int = 0; i < HTTPStatusEvent(e).responseHeaders.length; i++)
{
//правильный подсчет длины респонза сервера
if (HTTPStatusEvent(e).responseHeaders[i]['name'] == AIR_CONTENT_LENGTH)
{
total_response_length = Number(HTTPStatusEvent(e).responseHeaders[i]['value']); isHeaderPresent = true;
}
}
if (!isHeaderPresent)
{
total_response_length = 0;
}
}
Теперь смотрим евент процесса загрузки:
//процент загрузки
public var persentage:int = 0;
private function onRequestProgress(e:ProgressEvent):void
{
persentage = (total_response_length == 0)? int(e.bytesLoaded / e.bytesTotal * 100) : int(e.bytesLoaded / total_response_length * 100);
var bt_total:Number = (total_response_length == 0) ? e.bytesTotal : total_response_length;
}
Короче. Есть хэдэр – берём общее значение длины ответа из него, нет хэдэра – берется стандартный Content-Length, передаваемый сервером.
Случается так, что файл нужно записать на диск в кодировке, отличной от кодировки проекта. Поскольку нормальным в РФ считается клепать сайты и ПО в UTF-8 – то работа с документами MS Office (excel, csv) становится проблематичным в виду того, что Excel понимает UTF-8 в виде кракозябр.
private var fileRef:FileReference;
//выбрать файл
private function selectHndl(e:Event = null):void
{
var export_str:String = 'Здрасте-мордасте )) UTF-8 -> CP1251';
fileRef = new FileReference();
var ba:ByteArray = new ByteArray();
ba.writeMultiByte(export_str, 'x-cp1251');
fileRef.save(ba, "file.csv");
}
* This source code was highlighted with Source Code Highlighter.
Готово.
Что-то я давно не писал по поводу и без него. Объявляю открытие новой рубрики моего блога – Adobe AIR! Прошу любить и жаловать. В нем буду выкладывать то, что может быть интересно другим людям по этой категории, ибо опыта по ней набрался изрядно и есть, что поведать.
, хеллоу!