【问题标题】:Ball that fades away as it goes to the right球向右移动时逐渐消失
【发布时间】:2020-07-23 14:57:25
【问题描述】:

我的任务是编写一个程序,制作一个随着球向右移动而逐渐消失的圆球。但它不起作用,我可以在拖动鼠标时让球移动但不透明度是一样的。你们能帮帮我吗?我不知道如何将不透明度值转换为双精度

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.scene.paint.Color;

public class Project3 extends Application
{
   public static void main(String[] args) {
      launch(args);
   }
   public void start(Stage primaryStage) {
      Pane root = createRootPane();
      Scene scene1 = new Scene(root);
      primaryStage.setScene(scene1);
      primaryStage.setTitle(" Hai Vo ");
      primaryStage.show();
   }
   public Pane createRootPane()
   {
      Circle ball = new Circle (100,50,25);
      Pane root = new Pane(ball);
      root.setMinSize(300,300); 
      root.setOnMouseDragged (
       event ->
       {
         double x = event.getX();
         ball.setCenterX(event.getX());
         ball.setCenterY(event.getY());
         ball.opacityProperty().bind(ball.centerXProperty());
         double opacity = ball.opacityProperty();
         ball.setOpacity(opacity);
       } );
       return root;   
   }
}

【问题讨论】:

  • 在这一行duble opacity = ball.opacityProperty();,我想你只需要修正拼写,也许可以进行类型转换:double opacity = (double) ball.opacityProperty();
  • 哦,是的,我修好了,但是转换的错误还是一样。
  • 事件处理程序的最后两行没有任何意义,不管有没有错别字。您绑定了该属性,因此在取消绑定该属性之前无法直接分配值。最有可能你会得到一个完全不透明的圆圈,因为不透明度的范围是[0,1],并且向右移动会增加 x 值,因此在根据最大 x 值缩放值之后,不透明度也会增加......跨度>
  • 好吧,对不起,我学的很慢,所以你说我不应该将不透明度与 x 值绑定,因为不透明度在 [0,1] 范围内,而 x 值可以去到无穷远?那你应该如何建议修复它?

标签: java javafx opacity


【解决方案1】:

首先,将绑定移出事件处理程序。绑定将确保在centerX 属性更新时始终更新不透明度。

第二,不要设置绑定值;事件处理程序的最后两行只是将不透明度设置为其当前值。

第三,不透明度应该在 0 和 1 之间。当centerX 为 0 时,您希望它为 1,当 centerX 为 300 时,您希望它为 0(或者,通常是窗格的宽度)。

你需要的是(伪代码)

opacity = 1 - ball.centerX / root.width
        = (ball.centerX / root.width) * (-1) + 1

你可以用绑定来表达

ball.centerXProperty()
    .divide(root.widthProperty())
    .multiply(-1)
    .add(1)

所以放在一起,你需要:

public Pane createRootPane() {
   Circle ball = new Circle (100,50,25);
   Pane root = new Pane(ball);
   ball.opacityProperty().bind(
       ball.centerXProperty()
           .divide(root.widthProperty())
           .multiply(-1)
           .add(1)
   );
   root.setMinSize(300,300); 
   root.setOnMouseDragged (
    event ->
    {
      ball.setCenterX(event.getX());
      ball.setCenterY(event.getY());
    } );
    return root;   
 }

【讨论】:

  • 它就像一个魅力,你介意向我解释一下“ball.opacityProperty......”这一行,比如它具体在做什么?它在玩什么价值观?对不起,我是编码新手,所以基本上只是个菜鸟。
  • @HaiVo 如果 它就像一个魅力 考虑 accepting and up voting 答案
猜你喜欢
  • 2013-02-11
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
相关资源
最近更新 更多