12

我需要在父背景图案上显示我的 webview 内容。有没有简单的方法来做到这一点?

4

6 回答 6

14

这可能有用

final com.sun.webkit.WebPage webPage = com.sun.javafx.webkit.Accessor.getPageFor(engine);
webPage.setBackgroundColor(0);
于 2015-07-11T10:27:02.863 回答
10

Webview 透明我在这里得到了一个很好的解决方案:https ://javafx-jira.kenai.com/browse/RT-29186阅读评论 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) {
                }

            }
        }  
    } 
} 
于 2014-10-23T01:25:01.267 回答
6

如果你有明亮的背景使用

webView.setBlendMode(BlendMode.DARKEN);

当背景很暗时,然后

webView.setBlendMode(BlendMode.LIGHTEN);

这可能会在一段时间内得到修复,JavaFX 错误跟踪器#RT-25004请求了此功能

于 2013-02-04T17:54:31.190 回答
1

您可以使用混合效果对您的 WebView 进行色度键控。

更新

我尝试了这一点,并在 JavaFX 中使用 JavaFX 2.2 的内置混合效果实现真正的色度键实际上非常困难(并且超出了我的实现能力)。我设法使该技术适用于预色键 flv 视频格式,但不适用于 WebView 等任意节点。

尽管如此,就目前而言,您可以使用马提尼在他的回答中建议的变暗和变亮效果以简单的方式实现一些类似的效果。它并不完美,但可能需要在RT-25004实施或 JavaFX 平台提供更全面的 alpha 合成操作集之前就足够了。

于 2012-09-14T11:56:58.703 回答
0

您需要将网页背景设置为 0。但您可能需要做一些其他的事情以防止它在滚动时中断。以下 GitHub Gist 是一个 java 代理,可以添加到我们的应用程序中,并且可以将 WebPages 操作为透明。https://gist.github.com/riccardobl/18603f9de508b1ab6c9e或更多最新版本https://github.com/FAForever/downlords-faf-client/blob/develop/webview-patch/src/main/java/com /faforever/client/webviewpatcher/TransparentWebViewPatch.java

我找到并完全有效的唯一解决方案。

于 2020-05-03T22:29:36.930 回答
-1

我正在恢复它,因为我找到了一个更好的解决方案来解决WebView过度渐变的问题。假设你有一个像这样的渐变并且想要在它上面显示一个白色的 HTML 字符串,看起来像这样:

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

诀窍是将渐变转换为 Base64 字符串:

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

由于WebView加载任何 HTML 字符串,这可能涉及<body>具有背景的内容。在我的例子中,WebView渐变并没有占据整个空间,所以我也必须定位背景。以下是我在开头添加到上面的 HTML 字符串中的 HTML:

<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;">

最后:

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

因此产生这样的代码:

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);

为了清楚起见,您可能可以将样式放入<head>或以其他方式加载它们,但对于我在网上找到的任何其他问题,这是一个更好的解决方法。

于 2013-03-01T16:58:35.773 回答