我一直试图将一个代号内的youtube视频嵌入一个应用程序中。当我同时在Android和iOS上运行模拟器时,看起来不错,但是当我在Galaxy S7上实际运行该应用程序时,没有任何显示。我尝试使用BrowserComponent和WebBrowser都无法正常工作。我的代码如下:
Form hi = new Form("Hi World", BoxLayout.y());
Display display = Display.getInstance();
BrowserComponent browser = new BrowserComponent();
//WebBrowser browser = new WebBrowser();
String videoUrl = "https://www.youtube.com/embed/r6VO3zaBJGY";
int videoWidth = (int) ((double) display.getDisplayWidth());
int videoHeight = (int) ((double) videoWidth*0.5625);
String integrationCode= "<iframe src=\"" +videoUrl+"\" frameborder=\"0\" width=\"" + videoWidth + "\" height=\"" + videoHeight + "\" allow=\"autoplay; encrypted-media\" allowfullscreen></iframe>";
browser.setPage(integrationCode, null);
browser.getAllStyles().setPadding(0, 0, 0, 0);
browser.getAllStyles().setMargin(0, 0, 0, 0);
Container browserContainer = new Container(new BorderLayout(CENTER_BEHAVIOR_CENTER));
browserContainer.add(CENTER, browser);
hi.add(browserContainer);
hi.show();
最佳答案
该代码中有两个错误:BoxLayout
和CENTER_BEHAVIOR_CENTER
。
这不起作用的原因与布局的工作方式有关。布局管理器使用首选大小为组件提供正确的大小。 BrowserComponent
没有合适的首选大小,因为HTML的呈现是异步的,并且开始时非常灵活。在这种情况下,您使用了两个遵循首选大小的布局管理器。它们的大小等于零,并适当放置浏览器组件。BoxLayout.Y_AXIS
需要首选的高度,而CENTER_BEHAVIOR_CENTER
需要首选的大小,以将组件放置在中心。
典型的解决方法是使用常规的BorderLayout
(默认为缩放行为)。这会拉伸(stretch)中心组件以占用可用空间。请注意,您需要在Form
本身上进行设置,因为它具有整个屏幕的硬编码大小。中心位置忽略首选大小,并为组件提供完整大小。
它还解决了另一个问题。默认情况下,Form
在Y轴上可滚动。代号的可滚动性一个组件和本机窗口小部件(例如Web)可能会发生冲突,因此,通过使用边框布局,您可以隐式禁用滚动,在这种情况下可以提供出色的UX。
请注意,通过覆盖calcPreferredSize()
中的BrowserComponent
并返回组件所需的大小,可以使上面的代码起作用。由于滚动性问题,我认为这不会带来良好的用户体验。