2011-02-09 82 views
15

在Matlab中,當用戶放大繪圖窗口時,我想更新繪製在一組軸上的數據。例如,假設我想繪製一個分析定義的特定函數。當用戶放大軌跡時,我想用附加數據更新繪圖窗口,以便他們可以用任意分辨率檢查函數。繪圖放大/調整大小/重繪時,Matlab是否執行回調?

當視圖改變時,Matlab是否提供鉤子來更新數據? (或者乾脆當它重新繪製?)

回答

9

是的,它的確如此。所述ZOOM模式對象具有以下回調:

ButtonDownFilter 
ActionPreCallback 
ActionPostCallback 

後兩者執行要麼只是之前或剛好在變焦功能。您可以在ActionPostCallback中設置您的更新功能,您可以根據新的軸限制(軸的句柄作爲第二個輸入參數傳遞給回調函數)更新繪圖。

+0

謝謝,這正是我一直在尋找的!是否還有一個通用的重繪回調? – nibot 2011-02-09 02:09:42

+0

@nibot:你的意思是,像[`refresh`](http://www.mathworks.com/help/techdoc/ref/refresh.html)?或者,`drawnow`刷新隊列。 – Jonas 2011-02-09 02:13:10

16

雖然我還沒有找到一個通用的「重繪」回調來解決這個問題,但我已經設法湊齊了一組四個回調*,這些回調似乎在所有情況下都能達到這個目標。對於給定的對象座標軸ax = gca()

1.設置zoom callback function遵醫囑by @Jonas
set(zoom(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));

2.設置一個pan callback function
set(pan(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));

3.安裝一個figure resize callback function
set(getParentFigure(ax),'ResizeFcn',@(x,y) myCallbackFcn(ax));

4. 編輯:這個不再適用於R2014b,但只有在向圖中添加(例如,更改軸位置而不更改圖形尺寸或軸縮放/平移)的顏色條時才需要。我沒有找過替代品。最後,爲軸位置屬性本身設置一個undocumented property listener。這裏有一個重要的技巧:我們必須堅持對handle.listener對象的句柄,因爲一旦它被刪除(或離開作用域),它將刪除回調。軸對象本身的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以確保我不會以無限循環結束。

相關問題