Просмотр полной версии : Горизонтальный скролл. Как сделать плавный старт и конец прокрутки?
Добрый вечер. Делаю скрол своими силами и знаниями. Но знаний не много в программировании (я больше аниматор) по этому за возможно ужасный код прошу не бить, а поправить если есть возможность.
В общем сейчас всё работает, но мне нужно как бы плавный старт и финиш прокрутки. Как это можно реализовать я примерно понимаю, но думаю было бы правильным спросить у профи что бы код не выглядел ещё ужаснее.
Вод собственно код:
var posX:Number = scrolled._x;
var scrolledWidth = scrolled._width;
var dif1 = Math.floor(scrolled._x-(scrolled._width-masker._width));
trace(dif1);
scrolled.setMask(masker);
r_arrov.onRollOver = moveRight;
r_arrov.onRollOut = function() {
delete onEnterFrame;
};
l_arrov.onRollOver = moveLeft;
l_arrov.onRollOut = function() {
delete onEnterFrame;
};
function moveRight() {
onEnterFrame = function () {
if (scrolled._x<posX) {
scrolled._x += 1;
}
};
}
function moveLeft() {
onEnterFrame = function () {
if (dif1<scrolled._x) {
scrolled._x -= 1;
}
};
}
И исходник. За ранее спасибо!
Mnilionic
12.12.2008, 02:24
исходник восьмёрки давайте.
Не ужели никто не может помочь? Я не прошу написать код за меня, просто по советуйте (если не сложно) примерный путь решения задачи...
Mnilionic
12.12.2008, 17:12
ну вы сделайте тогда как понимаете, а я "ужасный код" причешу :)
Хорошо, вы сами на просились)
По путно возник ещё 1 вопрос.
Если Вам не сложно запустите ролик. Вы уведите что сама лента с картинками ровно по краям скрывается под маской. Но по всей видимости в результате не правильныйх округлений когда лента стопорится потому что закончились картинки и его края заезжают в область маски, тоесть такое не большое смещение(другими словами пустое место после окончания ленты видно под маской(примерно 1 пиксель)). Как это можно поправить?
Делать было нечего, поэтому написал вам эту функцию.
К сожалению исходник только CS3, потому что мой CS4 не умеет сохранять в 8м формате.
Но если что, напишу код тут. Просто сотрите все, что у вас есть, и вставьте этот код. Проверял - работает.
friction = 50;//степень торможения. Чем больше число, тем дольше тормозит.
long = 50;//длина пробега торможения, тоже влияет на скорость движения. Чем длиннее пробег, тем больше сокрость.
//соотоншение long/friction будет задавать скорость движения самой линейки. Чем больше это отношение, тем выше скорость.
left = Math.floor(scrolled._x-(scrolled._width-masker._width));//координата левого крайнего положения
right = scrolled._x;//и правого
scrolled.setMask(masker);//ставим маску
current = right;//координата текущего положения
l_arrov.onRollOver = function() {
current = long/friction;//в данном случае current будет скоростью движения
movingleft = true;
movingright = false;
};
l_arrov.onRollOut = function() {
c = scrolled._x-long;
if (c<left) {
current = left;//чтобы не зашло за край
} else {
current = c;//текущее положение минус длина пробега, чтобы линейка успела затормозить
}
movingleft = false;
movingright = false;
};
r_arrov.onRollOver = function() {
current = -long/friction;//все аналогично
movingleft = false;
movingright = true;
};
r_arrov.onRollOut = function() {
c = scrolled._x+long;
if (c>right) {
current = right;
} else {
current = c;
}
movingleft = false;
movingright = false;
};
_root.onEnterFrame = function() {
if (movingleft or movingright) {
if (scrolled._x<left+long && movingleft) {
distance = scrolled._x-left;//в случае приближения к краю начинается торможение
scrolled._x -= distance/friction;
} else if (scrolled._x>right-long && movingright) {
distance = right-scrolled._x;//аналогично
scrolled._x += distance/friction;
} else {
scrolled._x -= current;//обычное линейное движение (далеко от краев)
}
} else { //торможение при отпускании стрелки
distance = scrolled._x-current;//расстояние до точки, к которой стремится линейка
scrolled._x -= distance/friction;
}
};
Огромное спасибо. Сейчас гляну.
Да, всё супер. Ещё-раз спасибо Вам. Смотрю на Ваш код и сравниваю со своим и понимаю что это было не ужас, а просто кошмар. Буду учиться...
Возник ещё 1 момент который бы хотелось уточнить.
В данный скрол я загружаю картинки через xml. С этим нет проблем. Но появилось условие: нужно что бы скрол был зацикленным. Я поместил все клипы в один контейнер (созданный руками, не программно). Думал сделать 2 дубликата который поставить с лева основного мувика и соответственно с права основного мувика. Каждый раз когда скрол доходит до левого края (к примеру) его перебрасывает на такой-же кусок только с права. Таким образом осуществляется зацикленность (это всё с теории).
Но как только я начинаю дублировать мувик в который загрузил картинки он дублируется но пустым, то есть таким как был до загрузки в него картинок.
Прилогаю код на загрузку картинок:
Blok1 -мувик который пытаюсь продублировать.
var my_xml:XML = new XML();
my_xml.ignoreWhite = true;
my_xml.load('content.xml');
my_xml.onLoad = function(success:Boolean) {
if (success) {
var xml = my_xml.firstChild.childNodes;
var xml2 = my_xml.childNodes[1].childNodes;
for (var i = 0; i < xml2.length; i++) {
var newX = i * (_root.scrolled.block1._item._width + space);
diplicate = _root.scrolled.block1._item.duplicateMovieClip('_item' + i, i, {_x:newX});
diplicate.mc.loadMovie(xml2[i].attributes.pic);
diplicate.lnk = xml2[i].attributes.url;
diplicate.onRelease = function() {
getURL(this.lnk, '_blank');
trace(this.lnk);
scrollingOn = true;
};
}
} else {
trace('error');
}
};
Помогите советом. Спасибо.
И чему Вы удивляетесь? В хелпе же черным по белому написано - загруженный контент не дублируется методом duplicateMovieClip. Вы совершенно верно обратились к битмапдате - она как раз дублируется сколько угодно. Только еще раз повторюсь - выбросьте loadMovie! Не портите себе жизнь.
Спасибо)
То есть схема такая: Гружу всё при помощи MovieClipLoader и потом с этого общего клипа где всё находится делаю битмап дату и уже её дублирую?
Вопрос может быть не в тему, не читал все посты, но вопрос такой: чем отличается горизонтальный скролл от всех остальных типов скроллов?
Горизонтальный значит прокрутка располагается вдоль линии горизонта. С лева на право или на оборот (к примеру).
Горизонтальный значит прокрутка располагается вдоль линии горизонта. С лева на право или на оборот (к примеру).
Вопрос был не про внешний вид, а про логику.
с этого общего клипа где всё находится делаю битмап дату и уже её дублирую?Интересно, а как Вы нажатия на отдельные картинки будете ловить, если они все вместе - один рисунок?
Горизонтальный значит прокрутка располагается вдоль линии горизонта. С лева на право или на оборот (к примеру).
Эммм. А если я сделаю rotation градусов так на 30-35 CW, то как будет этот скролл называться?
Тему так назвал для уточнения. Зачем придераться?
Добавлено через 57 секунд
Интересно, а как Вы нажатия на отдельные картинки будете ловить, если они все вместе - один рисунок?
Вот этот вопрос я и задал в моей второй теме. Как же тогда быть?
Ну само собой делать битмапдату с каждой загруженной картинки и потом ее аттачить в отдельный ее собственный клип (в вашей легенде получается в три клипа - в центральном, левом и правом блоке - и получите три одинаковых блока)
А у меня другая проблемка, нужен вертикальный скролл,даже два)), а между ними собственно сами фотки, я довольно туго шарю в скриптах, я думала просто переделать х на у, лефт на топ , а райт на боттом, если конечно это выход))), но оказалось нет))))
Если кто -то может помочь, буду очень признательна, и главное как западло, нужно очень срочно,
могу прислать исходник, сюда не грузится(большой наверно(((((( только образно (fg)
заранее спасибо всем кто откликнется
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.