Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   NO_SCALE для элементов из SWC (http://www.flasher.ru/forum/showthread.php?t=151640)

proxiServer 03.03.2011 11:56

NO_SCALE для элементов из SWC
 
Подключаю из swc элементы интерфейса. У них режим масштабирования по умолчанию, show_all то бишь. Как сменить на NO_SCALE? Пробовал в основном клипе, куда addChild-ом добавляются все элементы делать такое:

Код AS3:

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

а что должно быть понятно?..есть какойто обработчик какого-то события, которое где-то диспатчица)

in4core 03.03.2011 13:58

Цитата:

private function addedToStage(e:Event)
Ну мне кажется по этому должно было быть понятно нам ))

cleptoman 03.03.2011 14:14

вот если бы была строчка
Код AS3:

someDispatcher.addEventListener(SomeEvent.SOME_EVENT_TYPE,someHandler)

тогда да, было бы понятно..что, где и когда.

proxiServer 03.03.2011 14:22

Цитата:

в вашем случае все scrollRectClip.stage могут возвращать null, если не добавлены на сцену
Я меняю scaleMode на событие по добавлению на stage. Понятно должно было быть то, что все элементы присутствуют на сцене. Или я ошибаюсь? Может быть в этом и запряталась ошибка.

Я сначала создаю бъект. Он наследуется от спрайта и при создании накидывает как бы на свою собственную сцену элементы. Потом я вешаю обработчик ADDED_TO_STAGE из конструктора класса на this.

Код AS3:

     this.addEventListener(Event.ADDED_TO_STAGE,addedToStage);

А этот объект я уже добавляю где-то в другом месте. Как я предполагаю, событие сработает тогда, когда я этот элемент где-нибудь добавлю на сцену. Я правильно понимаю? Или же оно срабатывает когда я на его сцену что-то добавляют?

Цитата:

все ваши stage указывают на один и тот же экземпляр класса Stage. он один одинешенек для всего приложения
Почему же тогда у разных спрайтов могут быть разные режимы scaleMode? Если бы объект был один, то и режим масштабирования был бы один на всех, разве нет?

cleptoman 03.03.2011 14:26

Цитата:

у разных спрайтов могут быть разные режимы scaleMode
эт я понимаю, что у них могут быть эти свойства и значения в них могут быть разные, но вы речь ведете о другом scaleMode, который у сцены. ввиду этого факта я перестаю понимать что вам, все-таки, нужно )

Добавлено через 1 минуту
т.е.
Код AS3:

scrollBarBackground.stage.scaleMode != scrollBarBackground.scaleMode


Hidest 03.03.2011 14:35

Вот-вот, видно, у автора нет понимания, что 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 у определенных элементов, а не у всей сцены?

Hidest 03.03.2011 14:51

Ну так а что вы хотите от скролла-то, если вы просто меняете размеры всего спрайта-оболочки этого скролла... Автоматом этого сделать нельзя, нет никаких волшебных scaleMode для вашего случая. Надо оверрайдить сеттер height и в нем программно перемещать элементы (кнопки) и перерисовывать, например, подложку и ползунок... Флеш-плеер не знает, какие элементы при изменении должны оставаться на месте, какие перемещаться, а какие изменяться в размерах.

А про sprite.stage.scaleMode естественно ошибочно считали. У каждого визуального объекта есть свойство stage которое ссылается на экземпляр класса Stage, если он добавлен на сцену (или в любой другой клип на ней)... Как уже было сказано, Stage всегда одна на всю флешку. Почитайте хелп, там это все описано.

proxiServer 03.03.2011 14:55

Это мне понятно) мне нужно что бы все элементы просто оставались на своих местах, что бы я ресайз написал, который их по нужным местам расставит. так нафига геометрию то менять?) главный вопрос - как у клипа поменять scaleMode? это возможно вообще?

gloomyBrain 03.03.2011 14:56

Я бы как-то так делал:
Код AS3:

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);
                }
 
        }
 
}


Hidest 03.03.2011 14:58

Оххх... Вы когда собираетесь поменять высоту, у вас кнопка "стрелка вниз" не должна уйти вниз? А подложка, по которому ползунок бегает, не должна увеличиться в размерах?

Не хотите переопределять сеттеры, заведите себе метод setSize(width:int, height:int):void и расставляйте там уже все как надо, а height и width не трогайте.

UPD: Глум опередил :)

proxiServer 03.03.2011 15:02

gloomyBrain, интересно) типа абстрактный класс своими силами?)

мужики, блин) я конечно не супер прогер, но подобные вещи понимаю!

Вы не на тот вопрос отвечаете) у одних клипов скейлМод такой, у других другой. ВОПРОС ПОЧЕМУ И КАК СДЕЛАТЬ ЧТО БЫ ВЕЗДЕ ОДИНАКОВО БЫЛО?

Hidest 03.03.2011 15:08

Охх (2 раза)...

Хорошо, пойдет от противного... Как ведет ваш скролл понятно, при изменении height все тянется... Тогда опишите, какой клип у вас не будет тянутся при изменении его высоты??? Может у вас где-то просто стоит scale9grid и вы не видите визуально, что и он тянется точно так же, кроме углов???

proxiServer 03.03.2011 15:12

Цитата:

Охх (2 раза)...
спасибо за терпение)
Цитата:

Тогда опишите, какой клип у вас не будет тянутся при изменении его высоты???
Вы хотите сказать, что все клипы будут изменять пропорции, если изменять их размер через widt,heigh?

Hidest 03.03.2011 15:16

Ну а как иначе? :)... Если поставить scale9grid, то углы не будут изменяться в размерах, боковые части будут меняться в одном направлении, а центральная часть - в обоих направлениях... Обычно делают это на подложках кнопок, окон и т.п., где может меняться размер, но размер загруглений не должен меняться... но все равно как ни крути - это растяжение клипа...

Поэтому вас и советовали либо заоверрайдить сеттеры, либо завести метод, меняющий размер вручную, либо же комбинацию первого и второго.

cleptoman 03.03.2011 15:18

один раз задайте Stage сой scaleMode в главном контейнере по событию ADDED_TO_STAGE
один раз подпишитесь на событие RESIZE
и тасуйте свои мувики в обработчике как хотите до потери пульса )

proxiServer 03.03.2011 15:58

все понял) спасибо за объяснения!

Hidest 03.03.2011 15:59

2cleptoman

Как выяснилось, stage тут вообще не при чем, товарищу нужны были нерастягивающиеся при растяжении спрайты :))

cleptoman 03.03.2011 16:25

ну это, как раз, в тему когда "всем все понятно")
переопределяем методы и вперед на баррикады )


Часовой пояс GMT +4, время: 00:00.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.