Muszę pokazać zawartość mojej strony internetowej nad rodzicielskim wzorem tła. Czy istnieje prosty sposób na zrobienie tego?Przezroczyste tło w WebView w JavaFX
Odpowiedz
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ą.
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
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.
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) {
}
}
}
}
}
To takie fajne! –
'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
Może to być użyteczne
final com.sun.webkit.WebPage webPage = com.sun.javafx.webkit.Accessor.getPageFor(engine);
webPage.setBackgroundColor(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
To działa na mnie z JDK 8 (1.8.0_40-EA), ale nie jest tak z JDK 7 (1.7.0_65) –