2014-08-27 25 views
9

Şeffaflık ve gölgeler hakkındaki birçok soruyu okudum, ancak bu özel sorunu ele aldığımı düşünmüyorum.Yalnızca kenarlıktaki gölgelerle JavaFX saydam bir aşama nasıl oluşturulur?

Hem saydamlık hem de gölge içeren bir pencere başarıyla oluşturabiliyorum, ancak renk gölgesinin saydamlık rengini etkilemeyeceğini anlayamıyorum. Örneğin, aşağıdaki kod gri saydam ve kırmızı bir gölge ile bir pencere oluşturur. Ancak, kırmızı renk ana pencerenin saydamlığını da etkiler, ancak ben sadece gölgenin pencerelerin sınırlarının dışına uzanmasını istiyorum.

enter image description here

Ama ne istediğim ise:

Yani ne alıyorum (el düzenlenen resim)

enter image description here

bu nasıl yapılacağı hakkında herhangi bir fikir?

Testim kodu:

@Override 
public void start(Stage stage) throws Exception { 
    stage.initStyle(StageStyle.TRANSPARENT); 

    StackPane stackPane = new StackPane(); 

    stackPane.setStyle(
     "-fx-background-color: rgba(255, 255, 255, 0.5);" + 
     "-fx-effect: dropshadow(gaussian, red, 50, 0, 0, 0);" + 
     "-fx-background-insets: 50;" 
    ); 

    Scene scene = new Scene(stackPane, 450, 450); 
    scene.setFill(Color.TRANSPARENT); 

    stage.setScene(scene); 

    stage.show(); 
} 

cevap

15

Ben gölge etkisi altına saydam üst içerik yoluyla göstermez böyle bir gölge efekti elde etme hakkında bir süre tür meraklı oldum.

Buraya geldiğim çözüm, gölge üzerinde kırpmayı kullanmaktı, böylece yalnızca gölgelendirildiği saydam içeriğin dışında görüntüleniyordu. İlgili

bloodstage

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.layout.*; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.*; 
import javafx.stage.*; 
import org.scenicview.ScenicView; 

// Java 8 code 
public class ClippedShadow extends Application { 

    private static final int shadowSize = 50; 

    @Override public void start(final Stage stage) { 
     stage.initStyle(StageStyle.TRANSPARENT); 

     StackPane stackPane = new StackPane(createShadowPane()); 
     stackPane.setStyle(
       "-fx-background-color: rgba(255, 255, 255, 0.5);" + 
       "-fx-background-insets: " + shadowSize + ";" 
     ); 

     Scene scene = new Scene(stackPane, 450, 450); 
     scene.setFill(Color.TRANSPARENT); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    // Create a shadow effect as a halo around the pane and not within 
    // the pane's content area. 
    private Pane createShadowPane() { 
     Pane shadowPane = new Pane(); 
     // a "real" app would do this in a CSS stylesheet. 
     shadowPane.setStyle(
       "-fx-background-color: white;" + 
       "-fx-effect: dropshadow(gaussian, red, " + shadowSize + ", 0, 0, 0);" + 
       "-fx-background-insets: " + shadowSize + ";" 
     ); 

     Rectangle innerRect = new Rectangle(); 
     Rectangle outerRect = new Rectangle(); 
     shadowPane.layoutBoundsProperty().addListener(
       (observable, oldBounds, newBounds) -> { 
        innerRect.relocate(
          newBounds.getMinX() + shadowSize, 
          newBounds.getMinY() + shadowSize 
        ); 
        innerRect.setWidth(newBounds.getWidth() - shadowSize * 2); 
        innerRect.setHeight(newBounds.getHeight() - shadowSize * 2); 

        outerRect.setWidth(newBounds.getWidth()); 
        outerRect.setHeight(newBounds.getHeight()); 

        Shape clip = Shape.subtract(outerRect, innerRect); 
        shadowPane.setClip(clip); 
       } 
     ); 

     return shadowPane; 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

Bu cevap ben etrafında alamadım biri saydam pencere ve çoklu parçalar vardı bölmeleri bazı diğer sorular, üzerine bir takip türüdür hakkında uygulanması: Yarı saydam bir pencerede bir halo gölge efekti elde etmek nasıl? (Bu soru)

+0

sayesinde bu çalışır. Kırmızı alt gölgeyi gerçekten saydam hale getirmek için herhangi bir fikir, böylece gölgeyi tıklamak pencerenin arkasındaki uygulamaya odaklanacak? – dejuknow

+0

Lütfen yeni bir soru olarak fare ele alma hakkında sorun deju, thx. – jewelsea

+0

Burada yeni bir soru yarattı: http://stackoverflow.com/questions/25650491/how-to-cause-clicking-on-transparent-areas-to-focus-on-applications-the-javafx-w. Teşekkürler! – dejuknow

İlgili konular