JavaFX css border-radius issue

后端 未结 3 1573
悲&欢浪女
悲&欢浪女 2021-01-23 00:53

I am trying to simulate the effect one would get from this css example:

border-radius: 50%;

From searching the API and reading posts on forums

相关标签:
3条回答
  • 2021-01-23 01:06

    This is not possible from CSS alone, since ImageView does not support any of Region's CSS properties.

    However you can use a Ellipse as clip for the ImageView:

    @Override
    public void start(Stage primaryStage) throws MalformedURLException {
        Image img = new Image("https://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Space_Needle_2011-07-04.jpg/304px-Space_Needle_2011-07-04.jpg");
        ImageView iv = new ImageView(img);
        Ellipse ellipse = new Ellipse(img.getWidth() / 2, img.getHeight() / 2, img.getWidth() / 2, img.getHeight() / 2);
        iv.setClip(ellipse);
    
        Text text = new Text("Space Needle, Seattle, Washington, USA");
        StackPane.setAlignment(text, Pos.TOP_CENTER);
    
        StackPane root = new StackPane(text, iv);
    
        Scene scene = new Scene(root, img.getWidth(), img.getHeight());
        scene.setFill(Color.AQUAMARINE);
    
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    

    I know it doesn't look good to let the image cover the text. This is only done for the purpose of demonstration.

    0 讨论(0)
  • 2021-01-23 01:20

    In one Line with Circle as Clip.You can use setClip(any shape).:

    imageView.setClip(new Circle(width,height,radius);
    

    The width,height,radius have to be slighty smaller that ImageView size to work.

    Inspired by GuiGarage web site.

    0 讨论(0)
  • 2021-01-23 01:24

    It looks like a CSS border-radius: 50% should create an elliptical border, and JavaFX CSS does support the % shorthand for either -fx-border-radius or -fx-background-radius. To get the desired effect, however, use Path.subtract() to create an elliptical matte for the image, as shown below.

    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.image.Image;
    import javafx.scene.image.ImageView;
    import javafx.scene.layout.StackPane;
    import javafx.scene.paint.Color;
    import javafx.scene.shape.Ellipse;
    import javafx.scene.shape.Path;
    import javafx.scene.shape.Rectangle;
    import javafx.scene.shape.Shape;
    import javafx.stage.Stage;
    
    /**
     * @see http://stackoverflow.com/a/38008678/230513
     */
    public class Test extends Application {
    
        private final Image IMAGE = new Image("http://i.imgur.com/kxXhIH1.jpg");
    
        @Override
        public void start(Stage primaryStage) {
            primaryStage.setTitle("Test");
            int w = (int) (IMAGE.getWidth());
            int h = (int) (IMAGE.getHeight());
            ImageView view = new ImageView(IMAGE);
            Rectangle r = new Rectangle(w, h);
            Ellipse e = new Ellipse(w / 2, h / 2, w / 2, h / 2);
            Shape matte = Path.subtract(r, e);
            matte.setFill(Color.SIENNA);
            StackPane root = new StackPane();
            root.getChildren().addAll(view, matte);
            Scene scene = new Scene(root);
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    
    0 讨论(0)
提交回复
热议问题