PDA

Просмотр полной версии : TileList + обработка события ошибочной ссылки на изображение


SpetZ_Naz
10.01.2013, 00:21
Здравствуйте!

Сделал простую галерею с выводом изображений из xml-базы в TileList. Изображения находятся на локальном диске. Добавил в DataProvider свои ссылки на изображения. Проблема в том что я не знаю как проверить подлинность ссылки на изображение в следствии чего, если присутствует ошибка в ссылке, то флеш выдает соответствующую ошибку отсутствия изображения.

Есть ли в компоненте TileList'а, событие которое будет адекватно реагировать на ошибки орфографии ссылки и вместо ошибки будет добавлять какое-нибудь дежурное изображение в TileList?

Предчувствую, что у меня примитивный вопрос и ждет ответ типа: повесь слушатель на TileList, который отслеживает IOErrors или что-то подобное. Кое-что пробовал, пытался реализовать и в описании компонента смотрел справочного материала, да и на форумах, но нигде не упоминается об этой (моей) проблеме. Возможно я просто невнимательный. Прошу подсказать. Спасибо.

dimarik
10.01.2013, 05:38
Привет! Повесь слушатель на рендерер TileList'а, который будет отслеживать IOErrors.

SpetZ_Naz
10.01.2013, 23:33
Нет, к сожалению не понял как повесить слушатель в рендерер TileList'а.

Я использую рендерер взятый от сторонних разработчиков на одном из зарубежных форумов. Кстати, для тех кто ищет решение как вручную придавать стиль ячейкам TileList'а, этот способ вам подойдет:

myForm.TileL.setStyle("cellRenderer", UserListRenderer);//соответственно так я его использую в программе

Вот непосредственно код UserListRenderer.as:

/****
* File: UserListRenderer.as
* Author: design1online.com, LLC
* Date: 9.4.2011
* Purpose: change the formatting for the user tile list
* so images appear beside the user name
****/
package {

import fl.controls.listClasses.ICellRenderer;
import fl.controls.listClasses.ImageCell;
import fl.controls.TileList;
import flash.text.*;

public class UserListRenderer extends ImageCell implements ICellRenderer {

public var desc:TextField = new TextField();
private var textStyle:TextFormat = new TextFormat();

public function UserListRenderer() {

//inherit the variables from the parent
super();

//we don't want to stretch our images to fit the size of the box
loader.scaleContent = false;

//change the cursor as if this was a button
useHandCursor = true;

//Create and format the text field
//that will appear beside the image
desc.autoSize = TextFieldAutoSize.CENTER;
desc.x = 24;
desc.y = 5;
desc.width = 150;
desc.height = 28;
desc.multiline = false;
desc.wordWrap = false;
addChild(desc);

//apply some styles to our text field
setStyle("imagePadding", 2);
textStyle.font = "Tahoma";
textStyle.color = 0xCC3300;
textStyle.size = 15;
}

/**
* Now we override the function that draws the layout
* so we can move the image beside the text
**/
override protected function drawLayout():void {

//adjust the icon for any existing padding
var imagePadding:Number = getStyleValue("imagePadding") as Number;

//offset the image in the box so it's not touching the top of it
loader.move(0, 4);

var w:Number = width-(imagePadding*2);
var h:Number = height-(imagePadding*2);

if (loader.width != w && loader.height != h) {
loader.setSize(w,h);
}

//re-draw the image
loader.drawNow();

//hide the original cellImage textField so we can display our new one later
textField.visible = false;

//display the new text box beside our image
desc.text = data.label;
desc.setTextFormat(textStyle);

//adjust the background
background.width = width;
background.height = height;

}
}
}

Пытался вешать событие на loader, по-идее он перерисовывает, не получилось. Не получилось также словить ошибку инструкцией try/catch.

Подправьте меня пожалуйста. Спасибо.

Выкладываю UserListRenderer.as. Кому нужен, забирайте:

dimarik
11.01.2013, 11:36
добавьте

/**
* @private (protected)
*/
protected override function handleErrorEvent(event:IOErrorEvent):void {
// загрузите здесь умолчальную картинку
// super.loader.source = 'http://example.com/default.png';
}

SpetZ_Naz
19.01.2013, 01:31
Да, спасибо, то что нужно) Я так понимаю, что если дежурного изображения не будет на месте, то возникнет ошибка загрузки, которую нужно словить через ЛоадИнфо Лоадера или не предусматривать дежурное изображение?

Может быть еще глупее вопрос: можно ли без отлова ошибок загрузки, проверить правильность ссылки на изображение, а не на пустоту из-за ошибки в ссылке?