В MATLAB, как вы можете выполнить обратный вызов во время перетаскивания ползунка?
Я создал GUI MATLAB с помощью GUIDE. У меня есть слайдер с функцией обратного вызова. Я заметил, что этот обратный вызов, который должен выполнять "при движении ползунка", на самом деле работает только после того, как ползунок был перемещен, и мышь была выпущена.
Есть ли способ запустить script при перемещении ползунка, для живого обновления сюжета? Я предположил бы, что должен быть чем-то, чтобы остановить запуск script слишком много раз.
Ответы
Ответ 1
Несмотря на то, что обратный вызов ползунка не вызывается при перемещении мыши, свойство 'Value'
свойства слайдера uicontrol . Таким образом, вы можете создать прослушиватель, используя addlistener
, который будет выполнять заданный обратный вызов при изменении свойства 'Value'
. Вот пример:
hSlider = uicontrol('Style', 'slider', 'Callback', @(s, e) disp('hello'));
hListener = addlistener(hSlider, 'Value', 'PostSet', @(s, e) disp('hi'));
При перемещении ползунка вы должны увидеть 'hi'
, который будет напечатан на экране (обратный вызов слушателя), а когда вы отпустите мышь, вы увидите 'hello'
напечатанный (обратный вызов uicontrol).
Ответ 2
Только для записи этот вопрос подробно обсуждается здесь: http://UndocumentedMatlab.com/blog/continuous-slider-callback/ - здесь представлено несколько альтернативных решений. Решение gnovice с использованием addlistener
эквивалентно handle.listener alternative
, так как addlistener
является в основном просто оболочкой для последнего.
Ответ 3
Если вы хотите выполнить тот же оригинальный обратный вызов, который вы передали в uicontrol
, вы можете добавить этот общий прослушиватель, который загружает существующий обратный вызов:
sld.addlistener('Value','PostSet',@(src,data) data.AffectedObject.Callback(data.AffectedObject,struct('Source',data.AffectedObject,'EventName','Action')));
Связанный пост в блоге