は、私は一緒にすべての状況(ほとんど?)で、この目標を達成するように見える4つのコールバックのグループ*を考え出すために管理しています。
set(zoom(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));
2.セットアップpan callback function:所定の軸がax = gca()
、
1.セットアップzoom callback function向けby @Jonasとしてオブジェクトの
set(pan(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));
3.セットアップをfigure resize callback function:
getParentFigure(ax)
set(
,'ResizeFcn',@(x,y) myCallbackFcn(ax));
4. 編集:これはR2014bでは機能しなくなりましたが、Figureにカラーバーなどを追加した場合(Figureのサイズや軸のズーム/パンを変更せずに軸の位置を変更する場合)のみ必要です。私は交換を探すつもりはありません。最後に、軸位置プロパティ自体にundocumented property listenerを設定します。ここでは重要なトリックが1つあります。オブジェクトが削除されると(またはスコープを残して)、コールバックが削除されるため、handle.listener
オブジェクトのハンドルを保持する必要があります。 Axesオブジェクト自体のプロパティーは、多くの場合それを隠すのに最適な場所です。UserData
私はデフォルトのコールバックのイベント引数を破棄し、代わりに匿名関数内で問題になっている軸をキャプチャするために選択したすべてのこれらのケースでは
hax = handle(ax);
hprop = findprop(hax,'Position');
h = handle.listener(hax,hprop,'PropertyPostSet',@(x,y) myCallbackFcn(ax));
set(ax,'UserData',h);
。これらの異なるコールバックシナリオを介して伝播するさまざまな形式の引数すべてに対処しようとするよりもはるかに便利であることがわかりました。
*また、非常に多くのコールバックソースが飛び回っているので、私は無限ループに終わらないようにmyCallbackFcn
の冒頭にrecursion checkを置くことは非常に貴重です。
ありがとう、これは私が探していたものです!一般的な再描画コールバックもありますか? – nibot
@nibot:あなたは['refresh'](http://www.mathworks.com/help/techdoc/ref/refresh.html)と同じですか?あるいは、 'drawnow'がキューをフラッシュします。 – Jonas
私は、Figureを再描画するたびにMatlabが指定する関数を呼び出すための方法があるのでしょうか? – nibot