Просмотр полной версии : NO_SCALE для элементов из SWC
proxiServer
03.03.2011, 11:56
Подключаю из swc элементы интерфейса. У них режим масштабирования по умолчанию, show_all то бишь. Как сменить на NO_SCALE? Пробовал в основном клипе, куда addChild-ом добавляются все элементы делать такое:
private function addedToStage(e:Event):void {
this.stage.scaleMode = StageScaleMode.NO_SCALE;
scrollBarBackground.stage.scaleMode = StageScaleMode.NO_SCALE;
bottomBtn.stage.scaleMode = StageScaleMode.NO_SCALE;
topBtn.stage.scaleMode = StageScaleMode.NO_SCALE;
scrollRectClip.stage.scaleMode = StageScaleMode.NO_SCALE;
scrollRectTop.stage.scaleMode = StageScaleMode.NO_SCALE;
scrollRectBottom.stage.scaleMode = StageScaleMode.NO_SCALE;
scrollRectPatern.stage.scaleMode = StageScaleMode.NO_SCALE;
}
Почему не работает?
cleptoman
03.03.2011, 13:21
потому что:
1 - все ваши stage указывают на один и тот же экземпляр класса Stage. он один одинешенек для всего приложения
2 - в вашем случае все scrollRectClip.stage могут возвращать null, если не добавлены на сцену.
proxiServer
03.03.2011, 13:40
cleptoman, про stage это я на всякий случай)
Забыл написать, функция подписана на события addedToStage. Я думал будет понятно. Или все равно может быть null?
cleptoman
03.03.2011, 13:56
а что должно быть понятно?..есть какойто обработчик какого-то события, которое где-то диспатчица)
private function addedToStage(e:Event) Ну мне кажется по этому должно было быть понятно нам ))
cleptoman
03.03.2011, 14:14
вот если бы была строчка
someDispatcher.addEventListener(SomeEvent.SOME_EVENT_TYPE,someHandler)
тогда да, было бы понятно..что, где и когда.
proxiServer
03.03.2011, 14:22
в вашем случае все scrollRectClip.stage могут возвращать null, если не добавлены на сцену
Я меняю scaleMode на событие по добавлению на stage. Понятно должно было быть то, что все элементы присутствуют на сцене. Или я ошибаюсь? Может быть в этом и запряталась ошибка.
Я сначала создаю бъект. Он наследуется от спрайта и при создании накидывает как бы на свою собственную сцену элементы. Потом я вешаю обработчик ADDED_TO_STAGE из конструктора класса на this.
this.addEventListener(Event.ADDED_TO_STAGE,addedToStage);
А этот объект я уже добавляю где-то в другом месте. Как я предполагаю, событие сработает тогда, когда я этот элемент где-нибудь добавлю на сцену. Я правильно понимаю? Или же оно срабатывает когда я на его сцену что-то добавляют?
все ваши stage указывают на один и тот же экземпляр класса Stage. он один одинешенек для всего приложения
Почему же тогда у разных спрайтов могут быть разные режимы scaleMode? Если бы объект был один, то и режим масштабирования был бы один на всех, разве нет?
cleptoman
03.03.2011, 14:26
у разных спрайтов могут быть разные режимы scaleMode
эт я понимаю, что у них могут быть эти свойства и значения в них могут быть разные, но вы речь ведете о другом scaleMode, который у сцены. ввиду этого факта я перестаю понимать что вам, все-таки, нужно )
Добавлено через 1 минуту
т.е.
scrollBarBackground.stage.scaleMode != scrollBarBackground.scaleMode
Вот-вот, видно, у автора нет понимания, что scaleMode у stage работает на всю сцену целиком, и неважно, откуда у вас все на ней взялось, из swc или подгружена внешняя библиотека символов.
Скажите, что вы потом делаете с флешкой и какое поведение каких клипов вам не подходит,тогда может станет понятней.
И кстати, я что-то не помню, чтобы у Sprite было свойство scaleMode
proxiServer
03.03.2011, 14:44
cleptoman, а как мне задать scalemode для клипа или спрайта? у них такого свойства нет.
Hidest, угу, сейчас расскажу подробней. В flashIDE были нарисованы элементы скролл бара. Далее их убрали в swc и эта библиотека подключена к проекту Flash Developer. Проблема в том, что когда я этот скрол закидываю - он работает нормально. Но если я меняю его размер тупо присваивая в height некое значение, то элементы скролбара начинают растягиваться или сжиматься под новое значение height. Я предположил, что у этих клипов установлен scalemode по умолчанию. И по видимому ошибочно считал, что sprite.stage.scaleMode меняет scaleMode конкретно этого спрайта. Вроде даже делал так.
Как тогда поменять scalemode у определенных элементов, а не у всей сцены?
Ну так а что вы хотите от скролла-то, если вы просто меняете размеры всего спрайта-оболочки этого скролла... Автоматом этого сделать нельзя, нет никаких волшебных scaleMode для вашего случая. Надо оверрайдить сеттер height и в нем программно перемещать элементы (кнопки) и перерисовывать, например, подложку и ползунок... Флеш-плеер не знает, какие элементы при изменении должны оставаться на месте, какие перемещаться, а какие изменяться в размерах.
А про sprite.stage.scaleMode естественно ошибочно считали. У каждого визуального объекта есть свойство stage которое ссылается на экземпляр класса Stage, если он добавлен на сцену (или в любой другой клип на ней)... Как уже было сказано, Stage всегда одна на всю флешку. Почитайте хелп, там это все описано.
proxiServer
03.03.2011, 14:55
Это мне понятно) мне нужно что бы все элементы просто оставались на своих местах, что бы я ресайз написал, который их по нужным местам расставит. так нафига геометрию то менять?) главный вопрос - как у клипа поменять scaleMode? это возможно вообще?
gloomyBrain
03.03.2011, 14:56
Я бы как-то так делал:
package ugo.view.abstract {
import flash.display.Sprite;
import flash.errors.IllegalOperationError;
/**
* Спрайт с возможностью ресайза
*
* @author gloomyBrain
*/
public class AbstractResizingSprite extends Sprite implements IResizeble {
protected var _width:Number = 0;
protected var _height:Number = 0;
public function AbstractResizingSprite() {
super();
if ((this as Object).constructor as Class == AbstractResizingSprite) {
throw new IllegalOperationError("Нельзя создать экземпляр абстрактного класса!");
}
}
public function setSize(width:Number, height:Number):void {
_width = (width < 0 || isNaN(width)) ? 0 : width;
_height = (height < 0 || isNaN(height)) ? 0 : height;
this.redraw();
}
protected function redraw():void {
throw new IllegalOperationError("Метод должен быть переопределен!");
}
/**
* Ширина контейнера
*/
override public function get width():Number {
return _width;
}
/**
* @private
*/
override public function set width(value:Number):void {
this.setSize(value, _height);
}
/**
* Высота контейнера
*/
override public function get height():Number {
return _height;
}
/**
* @private
*/
override public function set height(value:Number):void {
this.setSize(_width, value);
}
}
}
Оххх... Вы когда собираетесь поменять высоту, у вас кнопка "стрелка вниз" не должна уйти вниз? А подложка, по которому ползунок бегает, не должна увеличиться в размерах?
Не хотите переопределять сеттеры, заведите себе метод setSize(width:int, height:int):void и расставляйте там уже все как надо, а height и width не трогайте.
UPD: Глум опередил :)
proxiServer
03.03.2011, 15:02
gloomyBrain, интересно) типа абстрактный класс своими силами?)
мужики, блин) я конечно не супер прогер, но подобные вещи понимаю!
Вы не на тот вопрос отвечаете) у одних клипов скейлМод такой, у других другой. ВОПРОС ПОЧЕМУ И КАК СДЕЛАТЬ ЧТО БЫ ВЕЗДЕ ОДИНАКОВО БЫЛО?
Охх (2 раза)...
Хорошо, пойдет от противного... Как ведет ваш скролл понятно, при изменении height все тянется... Тогда опишите, какой клип у вас не будет тянутся при изменении его высоты??? Может у вас где-то просто стоит scale9grid и вы не видите визуально, что и он тянется точно так же, кроме углов???
proxiServer
03.03.2011, 15:12
Охх (2 раза)...
спасибо за терпение)
Тогда опишите, какой клип у вас не будет тянутся при изменении его высоты???
Вы хотите сказать, что все клипы будут изменять пропорции, если изменять их размер через widt,heigh?
Ну а как иначе? :)... Если поставить scale9grid, то углы не будут изменяться в размерах, боковые части будут меняться в одном направлении, а центральная часть - в обоих направлениях... Обычно делают это на подложках кнопок, окон и т.п., где может меняться размер, но размер загруглений не должен меняться... но все равно как ни крути - это растяжение клипа...
Поэтому вас и советовали либо заоверрайдить сеттеры, либо завести метод, меняющий размер вручную, либо же комбинацию первого и второго.
cleptoman
03.03.2011, 15:18
один раз задайте Stage сой scaleMode в главном контейнере по событию ADDED_TO_STAGE
один раз подпишитесь на событие RESIZE
и тасуйте свои мувики в обработчике как хотите до потери пульса )
proxiServer
03.03.2011, 15:58
все понял) спасибо за объяснения!
2cleptoman
Как выяснилось, stage тут вообще не при чем, товарищу нужны были нерастягивающиеся при растяжении спрайты :))
cleptoman
03.03.2011, 16:25
ну это, как раз, в тему когда "всем все понятно")
переопределяем методы и вперед на баррикады )
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.