Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   как сохранить размеры содержимого клипа при его resizing'е ? (http://www.flasher.ru/forum/showthread.php?t=126442)

iCanary 19.06.2009 07:47

как сохранить размеры содержимого клипа при его resizing'е ?
 
всем привет, такой вопросик интересный.

у меня есть мувиклип, который внутри себя тоже содержит мувиклипы. Так вот при изменении ширины клипа-холдера ширина внутренних тоже меняется, но я этого ОЧЕНЬ не хочу. как же быть?

etc 19.06.2009 08:16

Не вкладывать в холдер ничего.

iCanary 19.06.2009 08:22

это единственный вариант? неужели все настолько плохо..

etc 19.06.2009 08:27

Это самый простой. Если ничего внутри не должно изменять размеры, то зачем изменять размеры холдера?

iCanary 19.06.2009 08:31

ну тут вот как. у меня есть 4 колонки, в них по одной картинке в центре каждой. при ресайзинге всей области сцены, колонки должны растягиваться, а картинки внутри - ровняться по центру не изменяя своих размеров. никак не сделать внутри самих клипов?

etc 19.06.2009 08:34

http://noregret.org/tutor/elastic/

iCanary 19.06.2009 08:47

к сожаления этот как раз пример содержащий мою же проблему - объекты изменяют свои размеры и это ПЛОХО! ))) этого НЕ должно быть..

etc 19.06.2009 08:56

Не все изменяют размеры.

iCanary 19.06.2009 09:13

все. треугольник меняет высоту. Но это не тот пример. Здесь речь идет о "сцене". на сцене все элементарно. А вот сохранить пропорции ВНУТРИ мувиклипа - задачка друга и на мой взгляд более интересная.

etc 19.06.2009 09:26

Ну сделайте метод setSize, внутри него расставляйте контент по местам.

marat_sa 19.06.2009 10:12

Как вариант

Код AS3:

//запоминай первоначальный размер holder'a 
_defaultHolderWidth = holder.width;
 
//устанавливай его новый размер
holder.width = _newHolderWidth;
 
//компенсируй размеры детишек
for (var i:uint = 0; i < holder.numChildren; i++)
      holder.getChildAt(i).scaleX = _defaultHolderWidth / holder.width;


iCanary 19.06.2009 13:34

ВЕЛИКОЛЕПНОЕ РЕШЕНИЕ!

МАСШТАБНОЕ спасибо ))

etc 19.06.2009 13:44

Ужасное решение.

marat_sa 19.06.2009 13:57

Не такое уж и ужасное, хотя лучше пересмотреть подход к организации структуры и работе приложения в целом, если возникают подобного рода скрипты...

P.S.: я просто дал человеку решение поставленной задачи :)

Felicast 19.06.2009 14:35

может я не правильно понял вопрос.
но я в таких случаях делаю override высоты и ширины холдера, и сам управляю поведением внутренностей.

etc 19.06.2009 14:43

А это уже оптимальный вариант.

iCanary 19.06.2009 14:52

что значит override? каков принцип?

Котяра 19.06.2009 15:04

Как-то так..
Код AS3:

package  
{
        import flash.display.Sprite;
 
        /**
        * @author k0t0vich
        */

        public class Holder extends Sprite
        {
                child:Sprite;
 
 
                public function Holder()
                {
                        super();
                        addChild(child);
                        child.x = 10;
                }
 
                override public function set width(w:int)
                {
                        // смещаем по ширине
                        var oldWidth = super.width;
                        var delta = w - oldWidth;
                        child.x += delta;
                }
 
        }
 
}


etc 19.06.2009 15:14

Цитата:

Сообщение от Котяра (Сообщение 829301)
Как-то так..
Код AS3:

package  
{
        import flash.display.Sprite;
 
        /**
        * @author k0t0vich
        */

        public class Holder extends Sprite
        {
                child:Sprite;
 
 
                public function Holder()
                {
                        super();
                        addChild(child);
                        child.x = 10;
                }
 
                override public function set width(w:int)
                {
                        // смещаем по ширине
                        var oldWidth = super.width;
                        var delta = w - oldWidth;
                        child.x += delta;
                }
 
        }
 
}


Типа это работает? :quiet:

marat_sa 19.06.2009 15:29

_etc же сказал как правильно сделать - не суй в holder того, что не меняет размеры.
В holder ложишь свои 4 колонки, меняешь размеры holder'а - колонки тоже тянутся.
"Сверху" на holder накладываешь свои картинки и при изменении размера holder просто синхронизируй их с координатами/положением колонок или величиной растяжения holder (на свой вкус).

Felicast 19.06.2009 15:43

Цитата:

Сообщение от Котяра (Сообщение 829301)
Как-то так..
Код AS3:

package  
{
        import flash.display.Sprite;
 
        /**
        * @author k0t0vich
        */

        public class Holder extends Sprite
        {
                child:Sprite;
 
 
                public function Holder()
                {
                        super();
                        addChild(child);
                        child.x = 10;
                }
 
                override public function set width(w:int)
                {
                        // смещаем по ширине
                        var oldWidth = super.width;
                        var delta = w - oldWidth;
                        child.x += delta;
                }
 
        }
 
}


во-первых не нашел
Код AS3:

child = new Sprite();

или что-то в этом духе
во-вторых
Код AS3:

override public function set width(w:Number):void


etc 19.06.2009 15:46

Тогда уж
Код AS3:

public override function set width(value:Number):void


Felicast 19.06.2009 15:51

Цитата:

Сообщение от __etc (Сообщение 829309)
Тогда уж
Код AS3:

public override function set width(value:Number):void


а почему public раньше чем override? рекомендация?
просто по моему правельнее "переопределить публичную функцию", а не "публично переопределить функцию"

etc 19.06.2009 19:12

Felicast, это с точки зрения английского может и правильнее, а с точки зрения ActionScript все же уровень доступа идет везде первым, а уж потом не сильно важные модификаторы. Но это не рекомендация Adobe, у них как раз override вперед.

Котяра 19.06.2009 19:38

Спросили
Цитата:

что значит override?
Я написал : " как-то так" и не проверял работоспособность)
Причём я совсем и не уверен в работоспособности)))))

iCanary 20.06.2009 06:25

2 marat_sa

именно так и сделал изначально, так и закончил ) действительно самое оптимальное решение.


http://www.verstka.nocturneart.ru/v3/

etc 20.06.2009 14:51

Цитата:

Сообщение от iCanary (Сообщение 829439)
действительно самое оптимальное решение.

Нет, это самое ужасное решение, которое только можно было придумать.

iCanary 20.06.2009 15:37

__etc

ну что за дела )) ты бы хоть реально показал КАК надо делать.. просто ЭТОТ варинт мне в данном случае показался наиболее быстрым и оптимизированным

Felicast 20.06.2009 15:52

вам же товарищ Котяра показал. с небольшими правками оформления логика должна быть понятна
Код AS3:

public class Holder extends Sprite
{
        private var _width:Number;
        public function Holder()
        {
                //инициализируете
        }
 
        override public function set width(value:Number):void
        {
                _width = value;
                //пересчитываем размеры детей
        }
 
        override public function get width():Number
        {
                return _width;
        }
}

и ни каких scaleX


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

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