只是我教育旅行的又一步。我不知道什么时候/为什么我会使用透明特性,在实验中,我做了这个。
这幅画一旦完成就很有趣。这是一个动画飞行的gif,你可以移动它在屏幕周围,并按下键来改变它的速度或添加效果到图像本身。
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.Group;
import javafx.scene.effect.Bloom;
import javafx.scene.effect.Glow;
import javafx.scene.effect.MotionBlur;
import javafx.scene.effect.Reflection;
import javafx.scene.effect.Shadow;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCode;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
public class AnimatedFun extends Application {
int animationSpeed = 5;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
ImageView view = new ImageView(new Image("https://d2aao99y1mip6n.cloudfront.net/images/runes/idols/eJ8HJ8Ge9Ae9Be9Ae9Bj9Fj9Geigtzillnuhymn.gif"));
view.setEffect(new Glow());
view.setOnMouseClicked(e -> stage.close());
view.setFocusTraversable(true);
view.setOnKeyPressed(e -> {
if (e.getCode() == KeyCode.ESCAPE) {
stage.close();
} else if (e.getCode() == KeyCode.SPACE) {
view.setEffect(new Reflection());
} else if (e.getCode() == KeyCode.DELETE) {
view.setEffect(null);
} else if (e.getCode() == KeyCode.ENTER) {
view.setEffect(new Bloom());
} else if (e.getCode() == KeyCode.SHIFT) {
view.setEffect(new Shadow());
} else if (e.getCode() == KeyCode.RIGHT) {
stage.setX(stage.getX() + animationSpeed);
} else if (e.getCode() == KeyCode.LEFT) {
stage.setX(stage.getX() - animationSpeed);
} else if (e.getCode() == KeyCode.UP) {
stage.setY(stage.getY() - animationSpeed);
} else if (e.getCode() == KeyCode.DOWN) {
stage.setY(stage.getY() + animationSpeed);
} else if (e.getCode() == KeyCode.CONTROL) {
animationSpeed += 3;
if (animationSpeed >= 15) {
view.setEffect(new MotionBlur());
}
} else if (e.getCode() == KeyCode.ALT) {
if (animationSpeed >= 15 && animationSpeed < 18){
view.setEffect(new Glow());
}
animationSpeed = (Math.max(5, animationSpeed - 2));
}
});
Group root = new Group();
root.getChildren().add(view);
stage.setScene(new Scene(root, Color.TRANSPARENT));
stage.initStyle(StageStyle.TRANSPARENT);
stage.getIcons().add(new Image("https://d2aao99y1mip6n.cloudfront.net/images/runes/lg/eJ8HJ8Ge9Ae9Be9Ae9Bj9Fj9Geigtzillnuhymn.jpg"));
stage.show();
}
}感受自由的下载运行的罐子。
我想全面回顾一下它目前的状态,以及任何适当的改进,无论是关于JavaFX公约,还是仅仅是一般性结构。
请原谅使用在线链接对图像进行移植的水平混乱、副作用。
发布于 2015-04-26 06:35:41
最好将这个片段中出现的所有数字移到描述性命名的常量字段中:
} else if (e.getCode() == KeyCode.CONTROL) { animationSpeed += 3; if (animationSpeed >= 15) { view.setEffect(new MotionBlur()); } } else if (e.getCode() == KeyCode.ALT) { if (animationSpeed >= 15 && animationSpeed < 18){ view.setEffect(new Glow()); } animationSpeed = (Math.max(5, animationSpeed - 2)); }
如果您给出这些数字的名称,代码将变得更加直观。它还将减少必须在多个地方更新的值更改中的错误,例如animationSpeed >= 15中的数字15。
如果将常量放在类的首位,那么在一个地方调整有趣的参数将更容易,而不是在代码中翻找。
同样,也可以将图像urls放在常量中。你有两个不同的联系,但不明显的区别是什么。通过将这些值放入指定的常量中,就会变得清晰起来。线条应该稍微变宽一点。
发布于 2015-03-21 04:04:15
我会把那个巨大的if/else块拉到switch块中。
这将使您的代码更具可读性。(性能也略有改善。)现在很难看到逻辑,因为它隐藏在代码复制的后面。看看开关块如何使您很容易看到可能的密钥及其相应的行为。
switch(e.getCode()) {
case(KeyCode.ESCAPE) : stage.close(); break;
case(KeyCode.DELETE) : view.setEffect(null); break;
case(KeyCode.SPACE) : view.setEffect(new Reflection()); break;
...https://codereview.stackexchange.com/questions/84421
复制相似问题