下面列出了怎么用javafx.scene.input.ZoomEvent的API类实例代码及写法,或者点击链接到github查看源代码。
private void sendZoomEventToFX(EventType<ZoomEvent> eventType,
GestureEvent gestureEvent) {
Point los = toDisplay(gestureEvent.x, gestureEvent.y);
double[] totalZoom = new double[] { gestureEvent.magnification };
if (eventType == ZoomEvent.ZOOM_STARTED) {
// ensure first event does not provide any zoom yet
totalZoom[0] = lastTotalZoom = 1.0;
} else if (eventType == ZoomEvent.ZOOM_FINISHED) {
// SWT uses 0.0 for final event, while JavaFX still provides a
// (total) zoom value
totalZoom[0] = lastTotalZoom;
}
final double zoom = eventType == ZoomEvent.ZOOM_FINISHED ? 1.0
: totalZoom[0] / lastTotalZoom;
lastTotalZoom = totalZoom[0];
final boolean inertia = !gestureActive;
scheduleSceneRunnable(new ISceneRunnable() {
@Override
public void run(TKSceneListenerWrapper sceneListener) {
sceneListener.zoomEvent(eventType, zoom, totalZoom[0],
gestureEvent.x, gestureEvent.y, los.x, los.y,
(gestureEvent.stateMask & SWT.SHIFT) != 0,
(gestureEvent.stateMask & SWT.CONTROL) != 0,
(gestureEvent.stateMask & SWT.ALT) != 0,
(gestureEvent.stateMask & SWT.COMMAND) != 0, false,
inertia);
}
});
}
@Override
public void endZoom(ZoomEvent event) {
if (invalidGesture) {
return;
}
ITransactionalOperation commit = getViewportPolicy().commit();
if (commit != null && !commit.isNoOp()) {
try {
getHost().getRoot().getViewer().getDomain().execute(commit,
new NullProgressMonitor());
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
}
}
@Override
public void startZoom(ZoomEvent event) {
invalidGesture = !isZoom(event);
if (invalidGesture) {
return;
}
viewportPolicy = determineViewportPolicy();
viewportPolicy.init();
}
@Override
public void zoom(ZoomEvent event) {
if (invalidGesture) {
return;
}
// compute zoom factor from the given event
double zoomFactor = computeZoomFactor(event);
if (isContentRestricted()) {
// Ensure content is aligned with the viewport on the left and top
// sides if there is free space on these sides and the content fits
// into the viewport
panningSupport.removeFreeSpace(viewportPolicy, Pos.TOP_LEFT, true);
// calculate a pivot points to achieve a zooming similar to that of
// a text editor (fix absolute content left in x-direction, fix
// visible content top in y-direction)
InfiniteCanvas infiniteCanvas = ((InfiniteCanvasViewer) getHost()
.getRoot().getViewer()).getCanvas();
// XXX: The pivot point computation needs to be done after free
// space top/left is removed so that the content-bounds minX
// coordinate is correct.
Point2D pivotPointInScene = infiniteCanvas.localToScene(
infiniteCanvas.getContentBounds().getMinX(), 0);
// performing zooming
viewportPolicy.zoom(true, true, zoomFactor,
pivotPointInScene.getX(), pivotPointInScene.getY());
// Ensure content is aligned with the viewport on the right and
// bottom sides if there is free space on these sides and the
// content does not fit into the viewport
panningSupport.removeFreeSpace(viewportPolicy, Pos.BOTTOM_RIGHT,
false);
} else {
// zoom into/out-of the event location
viewportPolicy.zoom(true, true, zoomFactor, event.getSceneX(),
event.getSceneY());
}
}
private void addListeners() {
this.addEventHandler(MouseEvent.MOUSE_PRESSED, pressedHandler);
this.addEventHandler(MouseEvent.MOUSE_DRAGGED, draggedHandler);
this.addEventHandler(MouseEvent.MOUSE_RELEASED, releasedHandler);
if (Platform.isDesktop()) {
this.addEventHandler(ScrollEvent.ANY, scrollHandler);
} else {
this.addEventHandler(ZoomEvent.ZOOM_STARTED, zoomStartedHandler);
this.addEventHandler(ZoomEvent.ZOOM_FINISHED, zoomFinishedHandler);
this.addEventHandler(ZoomEvent.ZOOM, zoomHandler);
}
}
private void removeListeners() {
this.removeEventHandler(MouseEvent.MOUSE_PRESSED, pressedHandler);
this.removeEventHandler(MouseEvent.MOUSE_DRAGGED, draggedHandler);
this.removeEventHandler(MouseEvent.MOUSE_RELEASED, releasedHandler);
if (Platform.isDesktop()) {
this.removeEventHandler(ScrollEvent.ANY, scrollHandler);
} else {
this.removeEventHandler(ZoomEvent.ZOOM_STARTED, zoomStartedHandler);
this.removeEventHandler(ZoomEvent.ZOOM_FINISHED, zoomFinishedHandler);
this.removeEventHandler(ZoomEvent.ZOOM, zoomHandler);
}
}
@Override
protected void doHookScene(Scene scene) {
EventHandler<ZoomEvent> zoomFilter = createZoomFilter(scene);
scene.addEventFilter(ZoomEvent.ANY, zoomFilter);
zoomFilters.put(scene, zoomFilter);
}
@Override
protected void doUnhookScene(Scene scene) {
scene.removeEventFilter(ZoomEvent.ANY, zoomFilters.remove(scene));
}
/**
* Reaction to the finish of pinch (close fingers) gestures.
*
* @param e
* The original {@link ZoomEvent}.
*/
void endZoom(ZoomEvent e);
/**
* Reaction to the detection of pinch (close fingers) gestures.
*
* @param e
* The original {@link ZoomEvent}.
*/
void startZoom(ZoomEvent e);
/**
* Continuous reaction to pinch (close fingers) gestures. Called
* continuously on finger movement, after the gesture has been detected, and
* before it has been finished.
*
* @param e
* The original {@link ZoomEvent}.
*/
void zoom(ZoomEvent e);
/**
* Computes the zoom factor from the given {@link ZoomEvent}.
*
* @param event
* The {@link ZoomEvent} from which to compute the zoom factor.
* @return The zoom factor according to the given {@link ZoomEvent}.
*/
protected double computeZoomFactor(ZoomEvent event) {
return event.getZoomFactor();
}
/**
* Returns whether the given {@link ZoomEvent} should trigger zooming. Per
* default, will always return <code>true</code>.
*
* @param event
* The {@link ZoomEvent} in question.
* @return <code>true</code> if the given {@link ZoomEvent} should trigger
* zoom, otherwise <code>false</code>.
*/
protected boolean isZoom(ZoomEvent event) {
return true;
}
/**
* Handle a zoom event.
*
* @param event
* The zoom event.
*/
private void handleZoomEvent(final ZoomEvent event) {
if (!Double.isNaN(event.getZoomFactor())) {
zoomImage(event.getZoomFactor());
}
}