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

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

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

Регистрация: Aug 2006
Сообщений: 10
По умолчанию Скроллинг в чате со смайлами

для начала, помогла тема чата со смайлами http://www.flasher.ru/forum/showthread.php?t=88524 (спасибо ребятам)
сделал свой чат с помощью компоненты TextArea и столкнулся с проблемой скроллинга (немного урезал для понимания):
Код AS3:
	public function convert2Smile():void {
		setSmiles(); //здесь получаем arrayIco - массив со смайлами для текущего состояния чата
		if (chatScr) { //autoScrool
			chat.verticalScrollPosition = chat.maxVerticalScrollPosition;
		}
		getSmiles(chat.verticalScrollPosition); //размещение смайлов 
	}
 
	public function getSmiles(Y:Number = 0):void {
		var tf:TextField = chat.textField;//chat - собственно, сам компонент
		//var i = tf.getLineOffset(tf.scrollV-1); // было до скроллинга
		if (tf.scrollV == Y+1) {
			tf.scrollV = Y;
		}
		var i = tf.getLineOffset(Math.max(Y-1,tf.scrollV-1));
		var b = tf.getCharBoundaries(i);
		clearSmiles();//удаляем смайлы (pictures)
		pictures = new MovieClip();
		for (var k=0; k<arrayIco.length; k++) {
			var z = tf.getCharBoundaries(arrayIco[k].x);
			if (z != null && b != null) {
				if (z.y >= b.y && (z.y < (b.y + tf.height - 10))) {
					showPicture(z.x+1, z.y+5-b.y, arrayIco[k].type); //рисование самого смайла
				}
			}
		}
 
		addChild(pictures); //добавляем смайлы
	}
такая конструкция работает как часы при добавлении новой строки в чате, но для скроллинга добавляем:
Код AS3:
 
	private function announceEvent(event:ScrollEvent):void {
		getSmiles();
	}
и... происходит смещение смайлов на одну строку вверх, если скроллинг идет вверх и вниз, если - вниз..
изменил:
Код AS3:
 
	private function announceEvent(event:ScrollEvent):void {
		getSmiles(int(event.position)); //это для ппеременной Y в getSmile
	}
скроллинг заработал, но если сильно "помусолить" каретку скроллинга вверх-вниз, то иногда смайлы съезжаюта на строку, а иногда вовсе не рисуются... Чуть сдвинешь скроллинг и все встает на место...
что-то я заблудился или глаз замылил уже, может кто решал такую проблему?
Просьба, не предлагать написать свой скроллинг и т.д. Есть задача и ее надо решить.

Если что не понятно в объяснении, спросите - уточню.
Заранее спасибо.

Добавлено через 19 часов 32 минуты
Видимо, сложновато?
Может, надо отслеживать событие отпускания кнопки мыши после скроллинга, когда уже само текстовое поле окончательно обновится, ибо связываю сдвиг смайлов с некорректным отображением позиции скроллинга? Но не похоже ли это на грязный хак?


Последний раз редактировалось Squtter; 12.12.2008 в 19:48.
Создать новую тему   Часовой пояс GMT +4, время: 23:24.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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