Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Как задать шаг для ползунка (http://www.flasher.ru/forum/showthread.php?t=84796)

Whim 08.09.2006 12:13

Как задать шаг для ползунка
 
Я нарисовала линейку, на которой есть метки 1, 2, 3 и т.д. По этой линейке пользователь будет двигать ползунок выбирая значение. Как мне сделать, чтобы ползунок двигался строго по меткам, т.е. нельзя было установить его между метками, например, 4 и 5.
По нажатию мышкой по ползунку я начинаю StartDrag с ограничением, чтоб двигать можно было только по горизонтали в пределах линейки. А как установить шаг передвижения?:confused:

MINASTIS 08.09.2006 12:25

Попробуй сделать так. Хиттестом (а лучше координатами) задавать значение 1,2,3 и т.д., когда ползунок будет между цифрами. то есть разделить всю линейку на целые числа и в зависимости от положения ползунка выдавать целые же числа.

motor4ik 08.09.2006 12:50

короче алгоритм такой, шаг = сколько то пикселей, деля координату текущую на шаг, и округляя в нужную сторону получим координату шаговую )))

MINASTIS 08.09.2006 12:55

Один другого мудренее =))

Whim 08.09.2006 13:09

Цитата:

Сообщение от motor4ik
короче алгоритм такой, шаг = сколько то пикселей, деля координату текущую на шаг, и округляя в нужную сторону получим координату шаговую )))

Размер шага я сама могу вычислить. Я ведь спрашиваю не КАКОЙ шаг установить, а КАК его установить...

motor4ik 08.09.2006 13:20

...надо всего-лишь подумать...алгоритм я написал...

пользуетесь startDrag наверное...его отменяем теперь пишем функцию
Код:

polzunok.onEnterFrame=function():Void{

if (_root._ymouse>max){
  this._y=max;
}else if(_root._ymouse<min){
  this._y=min;
}else{
  this._y=Math.floor(_root._ymouse/shag);
}
};


miramax 08.09.2006 13:21

Код:

createEmptyMovieClip('roll', 1)
roll.lineStyle(0);
roll.beginFill(0xff0000);
roll.lineTo(0, 20);
roll.lineTo(20, 20)
roll.lineTo(20, 0)
roll.lineTo(0, 0)
function snapDrag(){
        step = 30 //шаг
        roll._x = 300;
        roll._y = Math.round(_ymouse/step)*step 
        roll._y -= roll._height        /2        ///для центровки по оис у
}
setInterval(snapDrag, 30)


Whim 08.09.2006 14:10

Цитата:

Сообщение от miramax
Код:

createEmptyMovieClip('roll', 1)
roll.lineStyle(0);
roll.beginFill(0xff0000);
roll.lineTo(0, 20);
roll.lineTo(20, 20)
roll.lineTo(20, 0)
roll.lineTo(0, 0)
function snapDrag(){
        step = 30 //шаг
        roll._x = 300;
        roll._y = Math.round(_ymouse/step)*step 
        roll._y -= roll._height        /2        ///для центровки по оис у
}
setInterval(snapDrag, 30)


передвигается нормально - по делениям. Вот только за мышкой не успевает:(

iNils 08.09.2006 14:11

Повесить snapDrag() на событие onMouseMove

motor4ik 08.09.2006 14:12

резвая у вас мышка )

Whim 08.09.2006 15:33

Цитата:

Сообщение от motor4ik
резвая у вас мышка )

:victory:

safronov 15.05.2009 16:11

Тоже задавался этим вопросом, но так ответа в сети не нашел (может плохо искал, но по мне очень хорошо рыл), поэтому нарисовал свой метод (работает как в МПЦ и КМП):

Код AS1/AS2:

var FrameNumber: Number = new Number(5); // количество положений ползунка
var ShagFrame: Number;
ShagFrame=(Navigation.SampleSlider.track_mc._width-1)/(FrameNumber-1) //считаем шаг ползунка
 
 
Navigation.SampleSlider.polzun_mc.onPress = function(){
        var framePlus:Number = new Number(Math.round(Navigation.SampleSlider.polzun_mc._x/ShagFrame)); // переменная для проверки перехода на новое значение, изначально ползунок установлен в первое значение.
        //делаем ползуноковый регулятор SampleSlider: track_mc-линия по которой таскаем, polzun_mc- активный ползунок (делаем его прозрачным) и размещаем поверх Indikator (красивышный пассивный ползунок)
        this.startDrag(false,Navigation.SampleSlider.track_mc._x,this._y,Navigation.SampleSlider.track_mc._width,this._y);
        this.onEnterFrame = function () {
                var frame = Math.round(Navigation.SampleSlider.polzun_mc._x/ShagFrame); //вычисляем новое целое значение положения (изначально 1)
                if (framePlus!=frame) { //проверяем изменилось ли новое значение и если да ...
                        // впишем новое значение для проверочной переменной
                        Navigation.SampleSlider.Indikator._x=ShagFrame*frame; // двигаем на новое значение пассивный ползунок
                            trace (173+frame);//проверим на какой фрейм попадем (у меня то что надо) :))
                        gotoAndPlay(173+frame);
                        framePlus=frame;
                }
        }
}
 
Navigation.SampleSlider.polzun_mc.onRelease =Navigation.SampleSlider.polzun_mc.onReleaseOutside = function(){
        Navigation.SampleSlider.polzun_mc._x=Navigation.SampleSlider.Indikator._x; // активный ползунок переместим на пассивный (он же прозрачный потом не найдем)
        this.stopDrag(); //убираем отработанный материал
        delete this.onEnterFrame;       
}

Может быть топорно, но мне кажется красивое и простое решение.
Дописываем, обсуждаем.

и для поиска: Перемещение с шагом, ползунковый регулятор с шагом (step), дискретный слайдер, пошаговый регулятор, дискретное перемещение

Жень Шень 15.05.2009 18:16

Вложений: 1
Мой вариант:
Код:

mc1_mc.onPress = function() {
        this.startDrag(false, 0, 0, 500, 0);
};
mc1_mc.onRelease = mc1_mc.onReleaseOutside=function () {
        var myStep = 50;
        this.stopDrag();
        this._x = roundAfteAddStep(this._x, myStep);
};
function roundAfteAddStep(par1, par2) {
        return par2*Math.round(par1/par2);
}

ЗЫ
Это 1000-е мое сообщение :yahoo:

safronov 16.05.2009 01:07

Вложений: 1
Жень Шень, спасиб. Чуть подправил твой исходник и свой проект.


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

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