我想在滚动事件上缩放窗格中的所有节点.
到目前为止我尝试了什么:
当我执行scaleX或scaleY时,窗格的边框分别缩放(在设置窗格样式时看到-fx-border-color: black;).因此,如果我不是从窗格的边界开始,并非每个事件都会启动,所以我需要它.
下一步我试图扩展每个节点,结果非常糟糕,就像这样 - (通过点延伸的线条).或者如果在另一侧滚动,则会更少
我尝试的另一种方法是缩放Node的点.它更好,但我不喜欢它.它看起来
point.setScaleX(point.getScaleX()+scaleX)和y和其他节点适当.
我正在尝试使用zoomable/pannable画布创建一个应用程序.
特点:
只要您开始按比例缩放,缩放点就会起作用.将鼠标放在网格点上并滚动鼠标滚轮.枢轴点将保持开始缩放的位置.
问题:
放大时,然后将鼠标移动到另一个点并再次缩放,然后移动枢轴点并在初始鼠标位置不再进行缩放.
示例:
这是代码:
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.scene.transform.Scale;
import javafx.stage.Stage;
/**
* The canvas which holds all of the nodes of the application.
*/
class PannableCanvas extends Pane {
Scale scaleTransform;
public PannableCanvas() {
setPrefSize(600, 600);
setStyle("-fx-background-color: lightgrey; -fx-border-color: blue;");
// add scale transform
scaleTransform …Run Code Online (Sandbox Code Playgroud) 缩放画布时有什么方法可以阻止这种模糊吗?我认为这与 GPU 插值有关。但我需要的是像素完美的“像素化”缩放。只需使用最近的“真实”相邻像素的颜色。
我已经在这里看到了解决方案,但在两个建议有效的解决方案中(#1 / #4),#4 肯定是 CPU 扩展,我想#1 也是如此。
这种扩展需要很快 - 我希望能够支持最多 20-25 层(可能是 StackPane 中的 Canvas,但我愿意接受其他想法,只要它们不熔化 CPU)。我怀疑这是否可以在没有 JFX 提供的 GPU 支持的情况下完成,但也许无法使用足够灵活的 API。像链接答案中的 #4 这样依赖于 CPU 重新调整的策略可能不会起作用。
如果使用此代码放大到最高缩放级别,模糊现象会很明显。
我们是否需要更新 JFX API 来支持此功能或其他功能?这应该是可以做到的。
import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Paint;
import javafx.stage.Stage;
public class ScaleTest extends Application {
private static final int width = 1200;
private static final int height = 800;
private static final int …Run Code Online (Sandbox Code Playgroud)