2012-09-14 11 views

Odpowiedz

1

Możesz wyświetlać swój WebView przez swoją stronę internetową przy użyciu efektów Blend.

Aktualizacja

Próbowałem tego i realizowania prawdziwego chroma key z wbudowanymi efektami mieszanka JavaFX 2.2 w JavaFX jest rzeczywiście dość trudne (i przekroczył moje możliwości wykonawczych). Udało mi się sprawić, by technika działała z formatami wideo flv z wstępnie zakodowanymi kluczami, ale nie z arbitralnymi węzłami, takimi jak WebView.

Na razie można w prosty sposób osiągnąć coś podobnego za pomocą efektów przyciemnienia i rozjaśnienia, jak sugeruje to martini w swojej odpowiedzi. Nie jest doskonały, ale prawdopodobnie będzie musiał wystarczyć, aż do implementacji RT-25004 lub platformy JavaFX zapewnia bardziej wszechstronny zestaw operacji komponowania alfą.

4

jeśli u mieć jasne tło używać

webView.setBlendMode(BlendMode.DARKEN); 

i gdy jest ciemno tło, następnie

webView.setBlendMode(BlendMode.LIGHTEN); 

ten prawdopodobnie zostanie ustalony w pewnym czasie, funkcja ta jest wymagana na JavaFX bug tracker #RT-25004

+0

To działa na mnie z JDK 8 (1.8.0_40-EA), ale nie jest tak z JDK 7 (1.7.0_65) –

-1

Wskrzeszam to, ponieważ znalazłem lepsze rozwiązanie dla problemu posiadania WebView na gradien t. Załóżmy, że masz gradient like this i chcesz wyświetlić ciąg HTML nad nim w kolorze białym, który wygląda mniej więcej tak:

<p>Integer semper, est imperdiet mattis porttitor, massa vulputate ipsum</p> 

Sztuką jest przekształcenie gradient Base64 ciąg:

iVBORw0KGgoAAAANSUhEUgAAAAEAAAHDCAYAAADlQnCCAAAAq0lEQVRIib2VwRWAMAhDaSdwCtd1No8uUzzp0ydBgjwvnmhCPrTKtKxbb73NXcaQLiL5j/olyhQH5JXu4H4sUGyWHAIa9VWjU9qtyAh6JGicIMJno2HcGSX3gJsCKH5EfUfHJUed+qFzekrpuVzM/oq4uFKGr/pI4B7wiP2Vgno0F/uCUQ9ZXWg4vM/JL1Hpt10Nt+hZjhCDKepxV8H3soZGWOqHP3ZSGYDdATTkg3iGU3JnAAAAAElFTkSuQmCC 

Od WebView ładuje dowolny ciąg HTML, może to obejmować <body>, który ma tło. W moim przykładzie, WebView nie zajmował całej przestrzeni z gradientem, więc musiałem również ustawić tło. Poniżej znajduje się HTML dodałem do napisu HTML powyżej na początku działalności:

<html> 
<head> 
</head> 
<body style="margin: 0px; padding: 0px; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAHDCAYAAADlQnCCAAAAq0lEQVRIib2VwRWAMAhDaSdwCtd1No8uUzzp0ydBgjwvnmhCPrTKtKxbb73NXcaQLiL5j/olyhQH5JXu4H4sUGyWHAIa9VWjU9qtyAh6JGicIMJno2HcGSX3gJsCKH5EfUfHJUed+qFzekrpuVzM/oq4uFKGr/pI4B7wiP2Vgno0F/uCUQ9ZXWg4vM/JL1Hpt10Nt+hZjhCDKepxV8H3soZGWOqHP3ZSGYDdATTkg3iGU3JnAAAAAElFTkSuQmCC); background-repeat: repeat-x; background-position: 0 -152px;"> 
<span style="font-family: Arial; font-size: 12px; color: white; display: block; margin:0px;"> 

I na koniec:

</span></body></html> 

Dlatego produkujących taki kod:

String desc = "<html><head></head><body style=\"margin: 0px; padding: 0px; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAHDCAYAAADlQnCCAAAAq0lEQVRIib2VwRWAMAhDaSdwCtd1No8uUzzp0ydBgjwvnmhCPrTKtKxbb73NXcaQLiL5j/olyhQH5JXu4H4sUGyWHAIa9VWjU9qtyAh6JGicIMJno2HcGSX3gJsCKH5EfUfHJUed+qFzekrpuVzM/oq4uFKGr/pI4B7wiP2Vgno0F/uCUQ9ZXWg4vM/JL1Hpt10Nt+hZjhCDKepxV8H3soZGWOqHP3ZSGYDdATTkg3iGU3JnAAAAAElFTkSuQmCC); background-repeat: repeat-x; background-position: 0 -152px;\"><span style=\"font-family: Arial; font-size: 12px; color: white; display: block; margin:0px;\">" + description + "</span></body></html>"; 
wv_desc.getEngine().loadContent(desc); 

Można prawdopodobnie umieścić style w <head> lub załadować je w inny sposób dla jasności, jak przypuszczam, ale jest to o wiele lepsze obejście wszystkiego, co znalazłem w sieci dla tego problemu.

7

Webview przejrzysty uzyskać dobre rozwiązanie tutaj: https://javafx-jira.kenai.com/browse/RT-29186 przeczytać komentarze Harry Hur

import java.lang.reflect.Field; 
    import javafx.application.Application; 
    import javafx.beans.value.ChangeListener; 
    import javafx.beans.value.ObservableValue; 
    import javafx.scene.Scene; 
    import javafx.scene.web.WebEngine; 
    import javafx.scene.web.WebView; 
    import javafx.stage.Stage; 
    import javafx.stage.StageStyle; 
    import org.w3c.dom.Document; ` 

    public class TestTranparentApps extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     new WebPage(primaryStage); 
     primaryStage.show(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

    class WebPage{ 

     WebView webview; 
     WebEngine webengine; 
     public WebPage(Stage mainstage){ 
      webview = new WebView(); 
      webengine = webview.getEngine(); 

      Scene scene = new Scene(webview); 
      scene.setFill(null); 

      mainstage.setScene(scene); 
      mainstage.initStyle(StageStyle.TRANSPARENT); 
      mainstage.setWidth(700); 
      mainstage.setHeight(100); 

      webengine.documentProperty().addListener(new DocListener()); 
      webengine.loadContent("<body style='background : rgba(0,0,0,0);font-size: 70px;text-align:center;'>Test Transparent</body>"); 
     } 

     class DocListener implements ChangeListener<Document>{ 
      @Override 
      public void changed(ObservableValue<? extends Document> observable, Document oldValue, Document newValue) { 
       try { 

        // Use reflection to retrieve the WebEngine's private 'page' field. 
        Field f = webengine.getClass().getDeclaredField("page"); 
        f.setAccessible(true); 
        com.sun.webkit.WebPage page = (com.sun.webkit.WebPage) f.get(webengine); 
        page.setBackgroundColor((new java.awt.Color(0, 0, 0, 0)).getRGB()); 

       } catch (Exception e) { 
       } 

      } 
     } 
    } 
} 
+0

To takie fajne! –

+0

'WebEngine.page' jest ostateczna, więc możesz wykonać odbicie bez potrzeby słuchania zmian dokumentu bezpośrednio przy tworzeniu webView. Chociaż moja wersja (JDK 1.7.80) używa 'com.sun.webpane.platform', ale prawdopodobnie jest taka sama. – TWiStErRob

8

Może to być użyteczne

final com.sun.webkit.WebPage webPage = com.sun.javafx.webkit.Accessor.getPageFor(engine); 
webPage.setBackgroundColor(0); 
+0

doskonały. aby uczynić WebView przeźroczystym, potrzebne są tylko dwa wiersze kodu. lub możesz uczynić go jedną linijką 'com.sun.javafx.webkit.Accessor.getPageFor (webviewgetEngine()). setBackgroundColor (0)' – Vishrant