Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 14.08.2011, 21:54
Mideon вне форума Посмотреть профиль Отправить личное сообщение для Mideon Найти все сообщения от Mideon
  № 1  
Ответить с цитированием
Mideon

Регистрация: Aug 2007
Сообщений: 54
По умолчанию Размеры контейнера после применения маски

Здравствуйте я совсем что то запутался. До этого считал что после применения маски, размеры контейнера имеют размеры маски. Но тут после добавления контента превышающего размеры контейнера. Контейнер имеет размеры равные контенту. Второе путание связано с StageScaleMode.NO_SCALE, до этого считал что достаточно указать в конструкторе главного класса stage.scaleMode = StageScaleMode.NO_SCALE и все контейнеры будут иметь неизменяемые размеры. Все представлено в коде:
Код AS3:
package
{
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.geom.Rectangle;
 
	public class TestMask extends Sprite
	{
	//private
		private var __container:Sprite;
		private var __mask:Shape;
		private var __child:Shape;
 
		private var __container2:Sprite;
		private var innerContainer:Sprite;
		private var __child2:Shape;
		private var __clipRect:Rectangle;
 
		public function TestMask()
		{ 
			init();
		}
	//initialization
		private function init():void {
//			stage.scaleMode = StageScaleMode.NO_SCALE;
			createContainer();
			createMask();
			createChild();
			makeHierarchy();
		}
 
		private function makeHierarchy():void {
			__container.addChild( __child );
			__container.addChild( __mask );
			__container.mask = __mask;
			addChild( __container );
 
			__clipRect = new Rectangle( 0, 0, 50, 50 );
			innerContainer = new Sprite();
			innerContainer.scrollRect = __clipRect;
			innerContainer.addChild( __child2 );
//			innerContainer.height = 50;
			__container2.addChild( innerContainer );
			addChild( __container2 );
		}
 
	//private methods
		private function createContainer():void {
			__container = new Sprite();
			__container.addEventListener( Event.ADDED_TO_STAGE, addedChildListener );
			__container2 = new Sprite();
			__container2.addEventListener( Event.ADDED_TO_STAGE, addedChildListener2 );
			__container2.x = 150;
		}
 
		private function createMask():void {
			__mask = new Shape();
			__mask.graphics.lineStyle( 0, 0x000000, 0 );
			__mask.graphics.beginFill( 0x000000, 1 );
			__mask.graphics.drawRect( 0, 0, 50, 50 );
			__mask.graphics.endFill();
		}
 
		private function createChild():void {
			__child = new Shape();
			__child.graphics.lineStyle( 0, 0xcccccc, 0 );
			__child.graphics.beginFill( 0xcccccc, 1 );
			__child.graphics.drawRect( 0, 0, 100, 100 );
			__child.graphics.endFill();
 
			__child2 = new Shape();
			__child2.graphics.lineStyle( 0, 0xcccccc, 0 );
			__child2.graphics.beginFill( 0xcccccc, 1 );
			__child2.graphics.drawRect( 0, 0, 100, 100 );
			__child2.graphics.endFill();
		}
 
	//events
		private function addedChildListener( e:Event ):void{
			graphics.lineStyle( 1, 0xff0000, 1 );
			graphics.drawRect( 0, 0, __container.width, __container.height );
			graphics.endFill();
		}
 
		private function addedChildListener2( e:Event ):void{
			__container2.stage.scaleMode = StageScaleMode.NO_SCALE;
			innerContainer.height = 50;
			graphics.lineStyle( 1, 0xff0000, 1 );
			graphics.drawRect( __container2.x, __container2.y, __container2.width, __container2.height );
			graphics.endFill();
		}
	}
}
на данный момент если раскоментить строку stage.scaleMode = с и изменить размеры контейнера, контейнер изменит размер а контент в нем деформируется. Если же не ставить stage.scaleMode = StageScaleMode.NO_SCALE; а добавить __container2.stage.scaleMode = StageScaleMode.NO_SCALE; в обработчик события addedChildListener2() контейнер примет размеры маски. Кто может объяснить в чем дело? Или есть какая информация по данным вопросам. Буду очень благодарен.

Старый 14.08.2011, 22:03
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 2  
Ответить с цитированием
goodguy
Banned

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Это нормально. Чтобы размеры контейнера всегда возвращались равными размеру маски, нужно просто переопределить геттеры width и height в этом контейнере, и возвращать размеры маски
Код AS3:
override public function get height():Number {
     return __mask.height;
}
например так.

п.с. Советую никогда не использовать двойное подчеркивание перед названиями свойств. Лучше уж одно

Старый 14.08.2011, 22:32
Mideon вне форума Посмотреть профиль Отправить личное сообщение для Mideon Найти все сообщения от Mideon
  № 3  
Ответить с цитированием
Mideon

Регистрация: Aug 2007
Сообщений: 54
Все равно не помогает. Родительский контейнер опять как то по своему все высчитывает если маскированный контейнер поместить еще в один контейнер ,т.е. высчитывает реальные размеры того что находится в маске. Хотя trace высоты возвращает размеры маски для маскируемого контейнера. Я переопределил height в контейнере.
Код AS3:
package
{
	import flash.display.Sprite;
 
	public class MaskContainer extends Sprite
	{
		public function MaskContainer()
		{
			super();
		}
 
		override public function get height():Number {
			return scrollRect.bottom;
		}
	}
}
от этого ничего не изменилось. Родительский контейнер этого контейнера все равно возвращает реальное значение маскируемого контейнера с контентом внтури этого контейнера.
Вложения
Тип файла: zip TestMask.zip (20.2 Кб, 27 просмотров)


Последний раз редактировалось Mideon; 14.08.2011 в 22:41.
Старый 15.08.2011, 14:26
Mideon вне форума Посмотреть профиль Отправить личное сообщение для Mideon Найти все сообщения от Mideon
  № 4  
Ответить с цитированием
Mideon

Регистрация: Aug 2007
Сообщений: 54
Мда какая то противоречивая статья. Здесь http://karoshiethos.com/2008/10/22/a...ght-getbounds/ наоборот не могут вычислить размеры внутреннего контента.

Добавлено через 22 минуты
Печалька http://www.moock.org/blog/archives/000292.html

Старый 15.08.2011, 17:20
3p.station вне форума Посмотреть профиль Отправить личное сообщение для 3p.station Найти все сообщения от 3p.station
  № 5  
Ответить с цитированием
3p.station
 
Аватар для 3p.station

блогер
Регистрация: Oct 2009
Адрес: кочевник. Киев
Сообщений: 453
Записей в блоге: 5
можно юзать scrollRect, но есть свои ньюансы...
__________________
мира и гармонии

Старый 15.08.2011, 17:28
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 6  
Ответить с цитированием
in4core
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Цитата:
Лучше уж одно
Не лучше а так нужно
__________________
Марк Tween

Старый 16.08.2011, 07:31
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 7  
Ответить с цитированием
goodguy
Banned

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
Сообщение от in4core Посмотреть сообщение
Не лучше а так нужно
На форумах по джаве, даже за одно подчеркивание загрызут

Старый 15.08.2011, 17:34
Mideon вне форума Посмотреть профиль Отправить личное сообщение для Mideon Найти все сообщения от Mideon
  № 8  
Ответить с цитированием
Mideon

Регистрация: Aug 2007
Сообщений: 54
scrollRect и юзаю, только нюансы такие же как и с маской. Т.е. баг расчета размеров очевиден, особенно когда контейнер с содержимым вставляется в другой (родительский ) контейнер и этому (родительскому) контейнеру задается фон . Сейчас сижу перекрываю height() и width() геттеры для мною созданного списка классов.

Старый 15.08.2011, 20:04
3p.station вне форума Посмотреть профиль Отправить личное сообщение для 3p.station Найти все сообщения от 3p.station
  № 9  
Ответить с цитированием
3p.station
 
Аватар для 3p.station

блогер
Регистрация: Oct 2009
Адрес: кочевник. Киев
Сообщений: 453
Записей в блоге: 5
как это не печально звучит но баг скорее всего дето у вас закрался.
__________________
мира и гармонии

Старый 16.08.2011, 11:07
Mideon вне форума Посмотреть профиль Отправить личное сообщение для Mideon Найти все сообщения от Mideon
  № 10  
Ответить с цитированием
Mideon

Регистрация: Aug 2007
Сообщений: 54
Цитата:
Сообщение от 3p.station Посмотреть сообщение
как это не печально звучит но баг скорее всего дето у вас закрался.
Хорошо, не могли бы вы предоставить хороший рабочий пример, того что это у вас работает. Мой пример представлен выше в виде приатаченного файла.

Добавлено через 4 минуты
Цитата:
Сообщение от goodguy Посмотреть сообщение
На форумах по джаве, даже за одно подчеркивание загрызут
Эта привычка от AS2( потому что там есть такие свойства как _x, _y, _width, _height ) и Caringorm Framework'a. Но это тема отдельного разговора.
Хотя интересно неужели в Java private поля пишутся без _ так же не интересно разделять в коде private от public. Т.е. по подчеркиванию в коде можно сразу понять что она private а не искать ее в объявлениях.

Создать новую тему Ответ Часовой пояс GMT +4, время: 23:47.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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