Хотя мне еще не удалось найти один общий обратный вызов «перерисовки» для решения этого вопроса, мне удалось собрать группу из четырех обратных вызовов *, которые, кажется, достигают этой цели (почти?) Во всех ситуациях. Для заданного объекта оси ax = gca()
,
1. Настройте функцию обратного вызова масштабирования в соответствии с указаниями от @ Jonas :
set(zoom(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));
2. Настройка функции обратного вызова панорамирования :
set(pan(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));
3. Настройте функцию обратного вызова изменения размера фигуры :
set(
getParentFigure(ax)
,'ResizeFcn',@(x,y) myCallbackFcn(ax));
4. Редактировать: эта функция больше не работает в R2014b, но необходима только в том случае, если вы добавите, например, цветовую полосу к фигуре (которая изменяет положение оси без изменения размера фигуры или увеличения / панорамирования оси). Я не искал замены. Наконец, настройте прослушиватель недокументированного свойства для самого свойства положения осей. Здесь есть один важный трюк: мы должны держаться за дескриптор объекта handle.listener
, так как после удаления (или выхода из области действия) он удаляет обратный вызов. Свойство UserData
самого объекта axes является хорошим местом для его хранения во многих случаях.
hax = handle(ax);
hprop = findprop(hax,'Position');
h = handle.listener(hax,hprop,'PropertyPostSet',@(x,y) myCallbackFcn(ax));
set(ax,'UserData',h);
Во всех этих случаях я решил отказаться от аргументов события обратного вызова по умолчанию и вместо этого захватить ось в анонимной функции. Я обнаружил, что это гораздо полезнее, чем пытаться справиться со всеми различными формами аргументов, которые распространяются через эти разрозненные сценарии обратного вызова.
* Кроме того, с таким большим количеством различных источников обратного вызова, я считаю неоценимым иметь проверку рекурсии в начале myCallbackFcn
, чтобы гарантировать, что я не попаду в бесконечный цикл .