Mentre devo ancora trovare un callback "ridisegna" generico per risolvere questa domanda, sono riuscito a mettere insieme un gruppo di quattro callback * che sembrano raggiungere questo obiettivo in (quasi?) Tutte le situazioni. Per un dato oggetto assi ax = gca()
,
1. Configurazione della zoom callback function come indicato by @Jonas:
set(zoom(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));
2. Imposta pan callback function: Configurazione
set(pan(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));
3. un figure resize callback function:
set(
getParentFigure(ax)
,'ResizeFcn',@(x,y) myCallbackFcn(ax));
4. Modifica: questo non funziona più in R2014b, ma è necessario solo se si aggiunge, ad esempio, una barra di colore alla figura (che modifica la posizione dell'asse senza modificare le dimensioni della figura o l'asse zoom/panoramica). Non ho cercato un sostituto. Infine, impostare uno undocumented property listener per la proprietà posizione degli assi. C'è un trucco importante qui: dobbiamo tenere il manico sull'oggetto handle.listener
come una volta eliminato (o lascia l'ambito), rimuove la callback. La proprietà UserData
dell'oggetto stesso è un bel posto in cui nasconderlo in molti casi.
hax = handle(ax);
hprop = findprop(hax,'Position');
h = handle.listener(hax,hprop,'PropertyPostSet',@(x,y) myCallbackFcn(ax));
set(ax,'UserData',h);
In tutti questi casi ho scelto di scartare gli argomenti dell'evento di default richiamata e invece cogliere l'asse in questione all'interno di una funzione anonima. Ho trovato che questo è molto più utile di provare a far fronte a tutte le diverse forme di argomenti che si propagano attraverso questi scenari di callback disparati.
* Inoltre, con così tante fonti di callback diversi volano intorno, trovo prezioso per avere un recursion check all'inizio del myCallbackFcn
per assicurare che io non finire in un ciclo infinito.
Grazie, questo è esattamente quello che stavo cercando! C'è anche un callback di ridisegno generico? – nibot
@nibot: vuoi dire, come ['refresh'] (http://www.mathworks.com/help/techdoc/ref/refresh.html)? In alternativa, 'drawnow' svuota la coda. – Jonas
Intendevo, c'è un modo per far chiamare a Matlab una funzione che specifichi ogni volta che ridisegna la figura? – nibot