В 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')));

Связанный пост в блоге