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

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

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

Регистрация: Sep 2010
Сообщений: 5
Post Контроль превышения child размеров parent

Доброго времени суток,

В приложении реализован следующий алгоритм:
1. Создается sprite1 фиксированного размера.
2. sprite1 помещается на box (из библиотеки визуальных компонентов ВК, но это к делу не относится, принимаем его за sprite0).
3. На sprite1 создается фиксированного размера sprite2.
4. На sprite2 в зависимости от кол-ва данных создаются textfield.

По окончанию п.4 высота sprite2 становится больше высоты sprite1, поэтому высота sprite1 увеличивается.

Box (sprite0) при привышении допустимых размеров данных добавляет scroll.

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


Каким образом мне следует организовать прокрутку sprite2 так, чтобы родительские элементы не реагировали на превышение высоты?

Старый 27.09.2010, 16:57
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 2  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Эм, а вычитать из скролла лишние размеры? Если размеры изначально фиксированные, то не будет проблем найти разность между новым размером и старым.
__________________
тут я

Старый 27.09.2010, 17:30
aintghost вне форума Посмотреть профиль Отправить личное сообщение для aintghost Найти все сообщения от aintghost
  № 3  
Ответить с цитированием
aintghost

Регистрация: Sep 2010
Сообщений: 5
КорДум,

Скролл реагирует на изменение высоты sprite1, который в свою очередь реагирует на изменение высоты sprite2..n. Так как на для остальных спрайтов (3..n) необходимо, чтобы скролл работал корректно, то требуется, чтобы sprite1 игнорировал именно высоту sprite2.

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

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

Регистрация: Apr 2001
Адрес: Berlin
Сообщений: 1,862
Отправить сообщение для derhab с помощью ICQ Отправить сообщение для derhab с помощью Skype™
то есть sprite1 должен иметь фиксированную высоту?
подпишите sprite1 на событие изменения высоты sprite2 и каждый раз в таком случае устанавливайте sprite1 фиксированную высоту
__________________
freelance | Раздор

Старый 27.09.2010, 18:57
aintghost вне форума Посмотреть профиль Отправить личное сообщение для aintghost Найти все сообщения от aintghost
  № 5  
Ответить с цитированием
aintghost

Регистрация: Sep 2010
Сообщений: 5
derhab,

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

Да, моя задача состоит в том, чтобы sprite1 не реагировал на превышение высоты sprite2, но реагировал на превышение высоты других child.

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

Регистрация: Apr 2001
Адрес: Berlin
Сообщений: 1,862
Отправить сообщение для derhab с помощью ICQ Отправить сообщение для derhab с помощью Skype™
напишите свой класс для sprite1, расширяющий Sprite и переопределите свойство height, задайте нужное вам поведение..
__________________
freelance | Раздор

Старый 27.09.2010, 23:16
aintghost вне форума Посмотреть профиль Отправить личное сообщение для aintghost Найти все сообщения от aintghost
  № 7  
Ответить с цитированием
aintghost

Регистрация: Sep 2010
Сообщений: 5
derhab,

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


Последний раз редактировалось aintghost; 27.09.2010 в 23:22.
Старый 27.09.2010, 23:22
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 8  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Изучите правила реализованные в других GUI-фреймворках, например, во Flex.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 28.09.2010, 13:14
aintghost вне форума Посмотреть профиль Отправить личное сообщение для aintghost Найти все сообщения от aintghost
  № 9  
Ответить с цитированием
aintghost

Регистрация: Sep 2010
Сообщений: 5
Написал класс, который при запросе размеров спрайта будет выдавать фиксированные значения. Присвоил данный класс объекту sprite2, тем не менее, sprite1 по какой-то причине изменяет свою высоту до реальной высоты sprite2.

Код AS3:
package
{
	import flash.display.Sprite;
 
	public class UnresizableSprite extends Sprite
	{		
		private var _width: Number;
		private var _height: Number;
 
		public function UnresizableSprite(width: Number, height: Number): void
		{
			_width = width;
			_height = height;
		}
 
		public override function get width(): Number
		{
			return _width;
		}
 
		public override function get height(): Number
		{
			return _height;
		}
	}
}
Каким образом спрайт узнает размеры своих child?

Добавлено через 2 часа 53 минуты
У моей задачи есть 2 пути решения:

I.
1) Уточнить как Sprite определяют размеры child.
2) Подделать значения размеров при помощи расширения класса Sprite.
3) Присвоить новый класс sprite2.

Таким образом фактический размер sprite2 будет соответствовать данным на нем, а parent будет считать, что sprite2 меньше.


II.
Так как box (sprite0) реагирует на свойство height sprite1, то:

1) Уточнить как происходит изменение размеров Sprite из-за child.
2) При изменении размеров проверить, чтобы они не были вызваны sprite2.
3) Подделать значения размеров.
4) Присвоить новый класс sprite1.

Таким образом фактический размер sprite1 будет соответствовать данным на нем, но:

* В случае изменения размеров, вызванных sprite2 - parent (box (sprite0)) будет получать подделанное значение и не будет добавлять скролл. Данные, выходящие за ограничения размеров будут спрятаны при помощи mask или scrollRect непосредственно в sprite2.

* В случае изменения размеров, вызванных не sprite2, а другими child - box получит реальные размеры и будет добавлять скролл.

Второй способ уже реализован, так как уже известно, как box (sprite0) определяет размеры child, и подделать эти значения можно.
Код AS3:
package
{
	import flash.display.Sprite;
	import flash.display.DisplayObject;
 
	public class UnresizableSprite extends Sprite
	{		
		private var _width: Number;
		private var _height: Number;
		private var _ignoreList: Array;
 
		public function UnresizableSprite(width: Number, height: Number): void
		{
			_width = width;
			_height = height;
		}
 
		public function set ingoreList(ignoreList: Array): void
		{
			_ignoreList = ignoreList;
		}
 
		override public function get width(): Number
		{
			return _width;
		}
 
		override public function get height(): Number
		{
			return _height;
		}
 
		override public function addChild(obj: DisplayObject): DisplayObject
		{
			if (!isIgnored(obj.name))
			{
				if (obj.x + obj.width > _width)
				{
					_width = obj.x + obj.width;
				}
 
				if (obj.y + obj.height > _height)
				{
					_height = obj.y + obj.height;
				}
			}
 
			return (super.addChild(obj));
		}
 
		private function isIgnored(name: String): Boolean
		{
			if (!_ignoreList)
				return false;
 
			var i: uint;
			var len: uint = _ignoreList.length;
 
			for (i = 0; i <= len - 1; i++)
				if (_ignoreList[i] == name)
					return true;
 
			return false;
		}
	}
}


Мне более импонирует первое решение - оно более логично, но, увы, пока не могу найти ответ на свой вопрос - как стандартный класс Sprite определяет размеры своих child?

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

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

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


 


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


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