[英]Matlab zoom mode and buttondownfcn
我正在MATLAB
創建GUI。 此gui有幾個不同的axes
對象。 在其中一個軸中,我使用zoom
工具(由圖形的工具欄激活)。 在不同的軸對象中,我禁用了縮放:
setAllowAxesZoom(zoom_handle,axes_handle,false)
...並繪制了一些可點擊的對象:
text(x,y,string,'buttondownfcn',{@func_handle, value});
所有這些都很好用...當鼠標位於不可縮放的繪圖中時,會出現一個普通的箭頭光標,如果單擊或單擊並拖動,則不會發生縮放。
然而! 我希望解決一個不便的問題。 我發現激活縮放工具后,單擊文本對象不會觸發buttondownfcn
回調。 現在,我需要返回工具欄以切換縮放模式。 我寧願只是在不同軸之間移動鼠標,並以編程方式激活適當的行為。
解決此問題的最佳方法是什么? 鼠標進入我的一個軸時是否可以使用回調? 如果是這樣,我可以在該回調中打開縮放工具,然后在相應的“離開事件”回調中再次將其關閉。 還是有一種方法可以在不可縮放的繪圖上傳播鼠標單擊事件,以便它找到要觸發的適當回調? 還是我沒有考慮的其他可能性?
編輯:我有這個工作。 我已經發布了一個解決方案,但也會對其他解決方案感興趣,這些解決方案在其他情況下可能會更好,更健壯,等等。
我意識到這是一個老問題,但你可以控制的State
縮放工具。 因此,您可以通過編程方式打開和關閉它,而無需將鼠標返回到工具欄。 您可以使用overobj
來測試是否在axes
。
我一起砍了一些適合自己情況的東西; 如果你希望它成為更通用的和強大的,你可以同樣啟動,但得到有關它的各種測試票友axes
被點擊的對象是,例如,是否有實際上安裝了一個回調的孩子,是否有額外的參數,等等
無論如何,對於我的特定情況,我關心的對象是text
對象,並且每個文本對象都安裝了一個回調函數,該回調函數只需要一個額外的參數 。
這是啟用縮放工具后允許我與這些文本對象進行交互的代碼:
function result = zoomtest(handle,eventdata)
result=false;
if strcmp(get(handle,'type'),'text')
callback=get(handle,'buttondownfcn');
callback{1}(handle,eventdata,callback{2})
end
end
set(zoom_handle,'buttondownfilter',@zoomtest)
令人高興的是,這不會干擾縮放工具照常工作,如果縮放工具未處於活動狀態,它也不會改變任何行為。
我已經發布了一個相關問題的解決方案,使旋轉工具與buttondownfcn
一起使用...縮放工具是相同的理念:
更新
好吧,我將擴展並充分說明此特定情況的答案:
在Matlab的幫助中描述了使用ButtonDownFilter
方法是在縮放模式下保持交互性的一種好方法:
function demo
% Allow a line to have its own 'ButtonDownFcn' callback.
hLine = plot(rand(1,10));
hLine.ButtonDownFcn = 'disp(''This executes'')';
hLine.Tag = 'DoNotIgnore';
h = zoom;
h.ButtonDownFilter = @mycallback;
h.Enable = 'on';
% mouse click on the line
%
function [flag] = mycallback(obj,event_obj)
% If the tag of the object is 'DoNotIgnore', then return true.
objTag = obj.Tag;
if strcmpi(objTag,'DoNotIgnore')
flag = true;
else
flag = false;
end
在您的情況下,代碼應類似於:
function demo2
%
% Allow a text element to have its own 'ButtonDownFcn' callback.
% And taging it for interaction
text(x,y,string,'buttondownfcn',{@func_handle, value}, 'tag', 'DoNotIgnore');
%
h = zoom;
h.ButtonDownFilter = @mycallback;
h.Enable = 'on';
%
% mouse click on the text element
%
function [flag] = mycallback(obj,event_obj)
% If the tag of the object is 'DoNotIgnore', then return true.
objTag = obj.Tag;
if strcmpi(objTag,'DoNotIgnore')
flag = true;
else
flag = false;
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.