Просмотр полной версии : выравнивание в бегущей строке
Здравствуйте. Вот у меня есть меню в виде бегущей строки. Там названия городов типа плывут. Названия берутся из xml. Подскажите пожалуйста, как мне сделать одинаковое между названиями расстояние? А то получается то шире (если название города короткое), то уже (если длинное). Можно, конечно, пробелов в эксэмэльке понаставить, но она генерится автоматически и города будут меняться заказчиком... Что же делать?
Alex_beginner
26.05.2008, 11:08
Поясните как релизована бегущая строка. Подробно, если можно.
Вот код:
var isPlay = true;
var clipList:Array = new Array();
if (_root['href'] == undefined) _root['href'] = "sample.xml";
function initSity(caption, href, index) {
var resultMC = this.cityProto.duplicateMovieClip("city_" + index, this.getNextHighestDepth());
resultMC._y = 0;
resultMC._x = index * resultMC._width;
resultMC.__proto__ = new CSity();
resultMC.init(caption, href, this);
return resultMC;
}
function init(configFileName) {
_root.config = new XML();
_root.config.ignoreWhite = true;
_root.config['owner'] = this;
_root.config.onLoad = function(success:Boolean) {
if (success) {
this['owner'].configure(this);
}
}
_root.config.load(configFileName);
}
function configure(xml:XML) {
var cities = xml.firstChild.childNodes;
var len = cities.length
for(var i = 0; i < len; i++) {
if (cities[i].nodeName == 'city') {
var city = cities[i].childNodes;
var name = city[0].firstChild.nodeValue;
var href = city[1].firstChild.nodeValue;
clipList.push(initSity(name, href, i));
}
}
}
init(_root['href']);
function onEnterFrame() {
// move captions
if (isPlay) {
for (var i = 0; i < clipList.length; i++) {
clipList[i]._x -= 0.3;
if (clipList[i]._x < -clipList[i]._width) {
clipList[i]._x = (clipList.length - 1) * clipList[i]._width;
}
}
}
}
Исходник нужен?
Alex_beginner
26.05.2008, 14:44
Насколько я понимаю расстановка названий по оси X производится в этой строке:resultMC._x = index * resultMC._width;
Поправьте если я неправ.
и как же мне сделать, чтобы названия друг от друга шли на динаковом расстоянии?
alexcon314
26.05.2008, 15:21
Curizor, исправьте свой третий пост в этой теме. Для оформления кода надо использовать теги
Alex_beginner
26.05.2008, 15:29
Ответье пожалуйста на поставленный вопрос, заданный в предыдущем моем посте!
Вообще-то это ширина всей строки с названиями городов
исправил
Alex_beginner
26.05.2008, 15:46
resultMC._x не может быть шириной. Это позиция левого-верхнего угла клипа, относительно начала координат клипа-носителя. Другое дело, что она рассчитывается через ширину клипа. Но это не имеет отношения к делу.
1.Вы ответьте да или нет. При реализации всего этого Вы подразумевали, что в этой строке будут задаваться позиции названий1/ городов или нет?
2. Что исправили?
3. Работает ли?
Да, так. Не работает. "Исправил" я написал модератору. Извините, я в форумах - новичек.
Alex_beginner
26.05.2008, 16:17
1.Скажите this.cityProto имеет точку регистрации в центре мува или левый верхний угол (или иное)?
2.Мне необходимо посмотреть текст класса CSity поскольку именно он отвечает за формирование самих надписей
DJ_Baton
27.05.2008, 02:26
А такой вариант чем плох - брать _x и _y объекта (в зависимости от того где надо отступо по высоте или ширине, прибавлять _width или _height объекта + определенный отступ, тогда можно выдержать четкое расстояние между всеми
Alex_beginner
27.05.2008, 09:47
DJ Baton!Curizor!
Все бы хорошо! Вот только ширина то, текущего клипа, а не предыдущего!
Поэтому, давайте подробно рассмотрим вот этот кусочек кода:
var resultMC = this.cityProto.duplicateMovieClip("city_" + index, this.getNextHighestDepth());
resultMC._y = 0;
resultMC._x = index * resultMC._width;
resultMC.__proto__ = new CSity();
resultMC.init(caption, href, this);
Что происходит в этих строчках!
1. Создается дубликат некоего клипа this.cityProto;
2. Ширина вновь созданного дубликата имеет то же значение, что и дублируемого клипа;
3. Координату левого-верхнего угла клипа-дубликата мы определяем как произведение счетчика цикла (см. ниже) и ширины текущего созданного дубликата;
4. Создаем потомок класса CSity;
5. Вызываем метод init() объекта класса-потомка от CSity.
Проанализируем п.2 и п.3, совместно.
Если, ширина всех создаваемых дубликатов одинакова, строчка:
resultMC._x = index * resultMC._width;
безусловно корректна. Поскольку, ее можно представить как сложение i равных значений. Ситуация в корне меняется, если эти расстояния неравны между собой. Тогда указанная выше формула для расчета положения клипа-названия некорректна, и будет давать искажения положения клипа-названия на родительской временной шкале.
Надейюсь объяснил понятно. Если не понятно, спрашивайте, объясню на примерах.
Теперь, как решить данную проблему.
Необходиму создать некоторую буфферную глобальную переменную в которую на текщей итерации - i, Вы будете записывать сумму ширин всех созданных на предыдущих итерациях дубликатов (клипов-названий). Тогда, позиция левого-верхнего угла текущего клипа-названия-дубликата будет определяться суммой ширин предыдущих. А после установки текущей позциии клипа, прибавив к ней ширину текущего клипа, мы получим позицию для клипа на следующей итерации.
В принципе, можно обойтись и без создания дополнительной глобальной переменной, а рассчитывать положение текущего клипа, как сумму двух значении - позиции _x предыдущего (на итерации i-1) созданного клипа-дубликата и его же ширины.
Это первый возможный вариант. Если он не поможет, то необходимо посмотреть текст реализации класса CSity, потому как именно он отвечает за формирование клипа-названия. Тест класса CSity здесь непредставлен.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.