Podczas gdy jeszcze nie znalazłem jednego ogólnego wywołania zwrotnego, aby rozwiązać to pytanie, udało mi się spleść grupę czterech wywołań zwrotnych *, które zdają się osiągać ten cel w (prawie?) Wszystkich sytuacjach. Dla danej osi obiektu ax = gca()
,
1. Setup zoom callback function jako skierowane by @Jonas:
set(zoom(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));
2. skonfigurować pan callback function:
set(pan(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));
3. skonfigurować figure resize callback function:
set(
getParentFigure(ax)
,'ResizeFcn',@(x,y) myCallbackFcn(ax));
4. Edycja: ten już nie działa w R2014b, ale jest potrzebny tylko wtedy, gdy dodasz, na przykład, pasek kolorów do figury (która zmienia położenie osi bez zmiany rozmiaru figury lub powiększenia/przesunięcia osi). Nie szukałem zastępstwa. Na koniec ustaw wartość undocumented property listener dla samej właściwości pozycji osi. Jest tu jedna ważna sztuczka: musimy przytrzymać uchwyt obiektu handle.listener
, ponieważ po jego usunięciu (lub opuszczeniu zakresu), usuwa wywołanie zwrotne. Właściwość UserData
samych obiektów osi jest miłym miejscem do przechowywania w wielu przypadkach.
hax = handle(ax);
hprop = findprop(hax,'Position');
h = handle.listener(hax,hprop,'PropertyPostSet',@(x,y) myCallbackFcn(ax));
set(ax,'UserData',h);
We wszystkich tych przypadkach zdecydowałem się odrzucić argumenty zdarzeń domyślny zwrotnych i zamiast uchwycić oś, w terminie anonimowej funkcji. Stwierdziłem, że jest to o wiele bardziej przydatne niż próba radzenia sobie ze wszystkimi różnymi formami argumentów, które propagują się przez te odmienne scenariusze wywołania zwrotnego.
* Także przy tak wielu różnych źródłach oddzwonienia uważam za nieocenione posiadanie recursion check na początku myCallbackFcn
, aby zapewnić, że nie skończę w nieskończonej pętli.
Dzięki, właśnie tego szukałem! Czy istnieje również ogólne oddzwanianie? – nibot
@nibot: Masz na myśli coś takiego jak "odśwież" (http://www.mathworks.com/help/techdoc/ref/refresh.html)? Alternatywnie, 'drawnow' opróżnia kolejkę. – Jonas
Mam na myśli, czy jest jakiś sposób, aby Matlab wywoływał funkcję, którą określam za każdym razem, gdy przerysowuje figurę? – nibot