![]() |
|
||||||||||
|
|||||
|
Регистрация: Jul 2012
Сообщений: 112
|
Создаются объекты cell. При клике на один из них хочу, чтобы менялся его цвет. В коде ниже видны мои попытки, но они неудачны. Как сделать?
public function displayCell(dataFromXML:XML):void { for(var i:int = 0; i < 5; i++) { var sizeCell:uint = 100; var cell:Sprite = new Sprite(); cell.graphics.beginFill(0xCCCCCC, 1.0); cell.graphics.lineStyle(1, 0x000000); cell.graphics.drawRect(i * sizeCell, 30, sizeCell, sizeCell); cell.buttonMode = true; addChild(cell); cell.addEventListener(MouseEvent.CLICK, cellActions); } } //Метод запускаемый по клику public function cellActions(e:MouseEvent):void { //Здесь, по идее, должно происходить изменение цвета //e.currentTarget.graphics.beginFill(0xFFFFFF, 1.0); e.target.graphics.beginFill(0xFFFFFF, 1.0);; } |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Это не изменяет цвет, а задает цвет для будущего рисования.
Добавлено через 7 минут Даже если Вы не согласны с советами сделать Cell отдельным классом, то хотя бы сделайте вразумительно сами спрайты-клетки. Зачем Вы рисуете в них в разных координатах? Рисуйте в (0, 0), и расставляйте спрайты в нужные координаты прямо в этом же цикле. Добавлено через 14 минут var cellSize:uint = 100; public function displayCell(dataFromXML:XML):void { for(var i:int = 0; i < 5; i++) { var cell:Sprite = new Sprite(); cell.graphics.beginFill(0xCCCCCC, 1.0); cell.graphics.lineStyle(1, 0x000000); cell.graphics.drawRect(0, 0, cellSize, cellSize); cell.buttonMode = true; addChild(cell); cell.x = i * cellSize; cell.y = 30; cell.addEventListener(MouseEvent.CLICK, onCellClick); } } //Метод запускаемый по клику public function onCellClick(e:MouseEvent):void { //Здесь, по идее, должно происходить изменение цвета var cell:Sprite = e.target as Sprite; cell.graphics.clear(); cell.graphics.beginFill(0xFFFFFF, 1.0); cell.graphics.lineStyle(1, 0x000000); cell.graphics.drawRect(0, 0, cellSize, cellSize); }
__________________
Reality.getBounds(this); Последний раз редактировалось Wolsh; 06.04.2013 в 15:57. |
|
|||||
|
Регистрация: Jul 2012
Сообщений: 112
|
так у меня cell в отдельном классе и фрагмент кода из него, а координаты у меня на самом деле не такие. Вопрос ведь по цвету, и координаты стоят не те, что в коде. Прикрепил полностью проект. Wolsh, прошу Вас его глянуть и оценить в плане правильности.
|
|
|||||
|
Не знаю стоит ли их перерисовывать - проще применить colorTransform
private function mouseEventHandler(event:MouseEvent):void { var obj:DisplayObject = event.target as DisplayObject; setTint(obj, color, percent); } private function setTint(object:DisplayObject, rgb:uint, percent:uint):void { var t:Transform = new Transform(object); var ct:ColorTransform = t.colorTransform; var ratio : Number = percent / 100; ct.redOffset = (rgb >> 16)*ratio; ct.greenOffset = ((rgb >> 8) & 0xFF)*ratio; ct.blueOffset = (rgb & 0xFF)*ratio; ct.redMultiplier = ct.greenMultiplier = ct.blueMultiplier = 1 - percent/100; t.colorTransform = ct; } Добавлено через 6 минут Для некоторых случаев когда элемент уже раскрашен определенным образом неплохо смотрится наложение поверх плашки в режиме BlendMode.OVERLAY (или другом). Тогда сохраняются некоторые оттенки основной графики и элемент обретает некоторый общий стиль в определенном тоне, а не происходит полное перекрашивание Добавлено через 7 минут А вообще посмотрите на устройство компонента DataGrid в стандартном наборе флеш компонентов или же его же и используйте
__________________
... |
|
|||||
|
Регистрация: Jul 2012
Сообщений: 112
|
Спасибо за все ответы, но не зацикливайтесь на изменении цвета. Я про цвет спросил, чтобы понять как вообще обратиться к объекту на который нажали и совершать с ним какие-то действия.
|
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
__________________
Отряд Котовскага |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
OK, зацикливаться на цвете реально не приходится. В Вашем коде при любом действии все объекты до единого заново пересоздаются. Я уже не говорю про эффективность использования памяти; объясните мне, как Вы собираетесь управлять системой, каждая часть которой удаляется и создается новая при любом действии?
Зачем Вам создавать новый редактор XML при каждом клике по "добавить/отнять колонку/строку"? Зачем удалять всю карту при этом и создавать с нуля новую? У Вас же в классе есть метод, обновляющий текущую карту (собственно о нем и ставился вопрос). И редактор в единственном числе прекрасно справляется. Такое ощущение, что код писали два человека, забыв договориться.
__________________
Reality.getBounds(this); |
|
|||||
|
СТранное у вас понятие о шутках...
Нет смысла это обсуждать в отрыве от конкретной задачи и условий. Для случая с использованием аппаратной поддержки, например, так перезагрузка данных тормознутее на пару порядков без вариантов. Ди и без аппаратной поддержки перерисовка занимает все же больше ресурсов чем перекраска.
__________________
... |
|
|||||
|
Регистрация: Jul 2012
Сообщений: 112
|
Цитата:
private var editor:XMLEditor; public function completeLoad(e:Event):void { // Присваиваем данные XML переменной dataMap = new XML(urlLoader.data); // Добавляем тулбар toolbar(); // Добавляем карту cellMap(); editor = new XMLEditor(dataMap); // теперь создаем только один редактор } public function buttonActions(e:MouseEvent):void { //удаление всех объектов убираем //removeChild(cell); //cell = null; if(e.target.name == "ADD_LINE") { editor.addLine(); } else if (e.target.name == "DEL_LINE") { //removeChild(cell); //cell = null; editor.delLine(); } else if (e.target.name == "ADD_COLUMN") { editor.addColumn(); } else if (e.target.name == "DEL_COLUMN") { //removeChild(cell); //cell = null; editor.delColumn(); } cell = new Map(); // обновляем отображение cell.displayCell(dataMap); addChild(cell); } |
![]() |
![]() |
Часовой пояс GMT +4, время: 01:30. |
|
|
« Предыдущая тема | Следующая тема » |
|
|