Trong khi tôi chưa tìm thấy một gọi lại chung "redraw" để giải quyết câu hỏi này, tôi đã quản lý để cobble cùng một nhóm bốn callbacks * mà dường như đạt được mục tiêu này trong (gần như?) Tất cả các tình huống. Đối với một trục cho đối tượng ax = gca()
,
1. Thiết lập các zoom callback function theo chỉ dẫn by @Jonas:
set(zoom(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));
2. Thiết lập một pan callback function:
set(pan(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));
3. Thiết lập một figure resize callback function:
set(
getParentFigure(ax)
,'ResizeFcn',@(x,y) myCallbackFcn(ax));
4. Chỉnh sửa: cái này không còn hoạt động trong R2014b, nhưng chỉ cần nếu bạn thêm, ví dụ: thanh màu cho hình (thay đổi vị trí trục mà không thay đổi kích thước hình hoặc thu phóng trục/pan). Tôi đã không tìm kiếm một sự thay thế. Cuối cùng, thiết lập một undocumented property listener cho chính thuộc tính vị trí trục. Có một thủ thuật quan trọng ở đây: Chúng ta phải giữ tay cầm đối tượng handle.listener
như một khi nó bị xóa (hoặc rời khỏi phạm vi), nó loại bỏ gọi lại. Các tài sản UserData
của các đối tượng trục chính nó là một nơi tốt đẹp để stash nó trong nhiều trường hợp.
hax = handle(ax);
hprop = findprop(hax,'Position');
h = handle.listener(hax,hprop,'PropertyPostSet',@(x,y) myCallbackFcn(ax));
set(ax,'UserData',h);
Trong tất cả các trường hợp này, tôi đã chọn loại bỏ đối số sự kiện gọi lại mặc định và thay vào đó chụp trục được đề cập trong một hàm ẩn danh. Tôi đã tìm thấy điều này hữu ích hơn nhiều so với việc cố gắng đối phó với tất cả các dạng đối số khác nhau truyền bá thông qua các tình huống gọi lại khác nhau này.
* Ngoài ra, với rất nhiều nguồn gọi lại khác nhau bay xung quanh, tôi thấy vô giá khi có recursion check ở đầu số myCallbackFcn
để đảm bảo rằng tôi không kết thúc trong vòng lặp vô hạn.
Cảm ơn, đây chính xác là những gì tôi đang tìm kiếm! Có cũng gọi lại redraw chung? – nibot
@nibot: Ý của bạn là, như ['refresh'] (http://www.mathworks.com/help/techdoc/ref/refresh.html)? Ngoài ra, 'drawnow' xóa hàng đợi. – Jonas
Tôi có nghĩa là, có một số cách để làm cho Matlab gọi một chức năng mà tôi chỉ định bất cứ khi nào nó vẽ lại hình? – nibot