当前位置: 首页 > 知识库问答 >
问题:

旋转对象的Alpha渐变-JavaFX画布

周辉
2023-03-14

下面可运行示例中的箭头应该用从箭头底部到箭头头部的红色alpha渐变填充。

import javafx.application.Application;
import javafx.geometry.Point2D;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.scene.paint.CycleMethod;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.stage.Stage;

public class JavaFXAlphaGradient extends Application {

    public static void main(String... args) {
        Application.launch(JavaFXAlphaGradient.class, args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        double size = 600.0;
        BorderPane pane = new BorderPane();
        Canvas canvas = new Canvas();
        pane.getChildren().add(canvas);
        canvas.setHeight(size);
        canvas.setWidth(size);
        Point2D midPoint = new Point2D(canvas.getWidth() / 2, canvas.getHeight() / 2);
        Point2D topLeft = new Point2D(0.0, 0.0);
        Point2D topRight = new Point2D(canvas.getWidth(), 0.0);
        Point2D bottomLeft = new Point2D(0.0, canvas.getHeight());
        Point2D bottomRight = new Point2D(canvas.getWidth(), canvas.getHeight());
        drawArrow(canvas, midPoint, topLeft);
        drawArrow(canvas, midPoint, topRight);
        drawArrow(canvas, midPoint, bottomLeft);
        drawArrow(canvas, midPoint, bottomRight);
        Scene scene = new Scene(pane, size, size);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void drawArrow(Canvas canvas, Point2D from, Point2D to) {
        GraphicsContext gc = canvas.getGraphicsContext2D();
        double distance = from.distance(to);
        double arrowWidth = 30.0;
        double arrowheadSide = 30.0;
        gc.save();
        Point2D rotationPoint = new Point2D((from.getX() + to.getX()) / 2, (from.getY() + to.getY()) / 2);
        gc.translate(rotationPoint.getX(), rotationPoint.getY());
        double theta = Math.atan2(from.getY() - to.getY(), from.getX() - to.getX());
        gc.rotate(180 + Math.toDegrees(theta));
        gc.beginPath();
        gc.moveTo(-distance / 2, arrowWidth / 2);
        gc.lineTo(distance / 2 - arrowWidth, arrowWidth / 2);
        gc.lineTo(distance / 2 - arrowWidth, arrowWidth / 2);
        gc.lineTo(distance / 2, 0.0);
        gc.lineTo(distance / 2 - arrowWidth, -arrowheadSide / 2);
        gc.lineTo(distance / 2 - arrowWidth, -arrowWidth / 2);
        gc.lineTo(-distance / 2, -arrowWidth / 2);
        gc.closePath();
        Color red03 = new Color(1.0, 0.0, 0.0, 0.3);
        Color red08 = new Color(1.0, 0.0, 0.0, 0.8);
        // I want an alpha gradient for each arrow from "from" to "to" - this doesn't work though
        gc.setFill(new LinearGradient(from.getX(), from.getY(), to.getX(), to.getY(), true,
                CycleMethod.NO_CYCLE, new Stop(0.0, red03), new Stop(1.0, red08)));
        gc.fill();
        gc.restore();
    }

}

我一定错过了什么明显的事情!?

谢谢你的调查!

Stackoverflow希望我添加更多细节,因为“大部分是代码”,但我真的不知道要添加什么。:-)

共有1个答案

司徒云
2023-03-14

我明白了-对不起,我完全误读了有关比例变量的文档。

gc.setFill(new LinearGradient(0, 0, 1, 0, true, CycleMethod.NO_CYCLE, 
    new Stop(0.0, red03), new Stop(1.0, red08)));
 类似资料:
  • 本文向大家介绍Android动画之渐变动画(Tween Animation)详解 (渐变、缩放、位移、旋转),包括了Android动画之渐变动画(Tween Animation)详解 (渐变、缩放、位移、旋转)的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android动画之渐变动画(Tween Animation)。分享给大家供大家参考,具体如下: Android 平台提供了两类动画。

  • 问题内容: 我目前正在开发一个绘画程序(类似于Gimp和Photoshop),为了做到这一点,我将需要图层。我创建了一个名为JImage的类,其中包含和一些方法。 我的问题是,当您这样做时,不包括alpha层,并且背景始终为白色。这样可以防止我在没有丑陋的白色背景的情况下将其发送到文件中。有什么办法可以从具有alpha层的多个画布中获取图像?我希望将JavaFX用于此解决方案,因此请在JavaFX

  • 主要内容:JavaFX渐变颜色,线性梯度(LinearGradient),径向渐变,半透明渐变,反射循环渐变JavaFX渐变颜色 可以使用径向渐变使形状看起来三维(立体)。 梯度绘制可以在两种或更多种颜色之间内插,这给出形状的深度。JavaFX提供两种类型的渐变:径向渐变()和线性渐变()。 要在JavaFX中创建渐变颜色,需要设置五个属性值。如下 - 设置开始起点的第一个停止颜色。 将终点设置为终止停止颜色。 设置属性以指定是使用标准屏幕坐标还是单位平方坐标。 将循环方法设置为使用三个枚举:,

  • 问题内容: 我使用以下代码为基于RotatedTranstion的ImageView创建了动画: 这将产生以下动画: 轮换行动 就像您在动画gif中注意到的那样,动画不是连续的,即在动画周期之间存在很小的延迟(暂停)。 我试图看一下API,但无法弄清楚是什么原因造成了这种延迟以及如何摆脱这种延迟。 问题答案: 每个周期之间的明显停顿是由内插器引起的,默认情况下会使用该插值器(因此它在每个周期的末尾

  • 问题内容: 我有一个方法需要旋转,将其存储在新变量中,然后返回new 。这是我的尝试,图像似乎为空或什么。它只是不显示在屏幕上: 当我取出图像时,在屏幕上绘制的图像就很好,没有问题,但是当然没有旋转。 问题答案: 因此,基于此答案中的示例,您应该能够设计一种旋转方法,该方法可以将源图像旋转给定的度数,例如…

  • 我有一个方法,它需要旋转,将其存储在一个新变量中,然后返回新的。这是我的尝试,图像似乎是空的什么的。它只是不显示在屏幕上: 当我取出时,图像在屏幕上绘制得很好,没有任何问题,但当然没有旋转。