悬停效果改为在 JFXRippler 中实现 by CiiLu · Pull Request #5757 · HMCL-dev/HMCL

medium

目前的动画实现方式在鼠标快速移入移出时会产生明显的跳变。这是因为每次事件都会创建一个新的 Transition,并且动画总是从固定的起始值(0 或 1)开始,而没有考虑当前的透明度状态。建议改用 Timeline 并直接对 hoverOverlayopacityProperty 进行动画处理,这样 JavaFX 会自动从当前值开始平滑过渡,同时也能减少对象的频繁创建。

            mouseEventHandler = event -> {
                if (coverAnimation != null) {
                    coverAnimation.stop();
                }

                boolean isEntered = event.getEventType() == MouseEvent.MOUSE_ENTERED;
                Color onSurface = Themes.getColorScheme().getOnSurface();
                hoverOverlay.setFill(Color.color(onSurface.getRed(), onSurface.getGreen(), onSurface.getBlue(), 0.04));

                coverAnimation = new Timeline(new KeyFrame(Motion.SHORT4,
                    new KeyValue(hoverOverlay.opacityProperty(), isEntered ? 1 : 0, isEntered ? Motion.EASE_IN : Motion.EASE_OUT)));
                coverAnimation.play();
            };