- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望逐 block 绘制 vector ,每次添加新 block 时重新绘制 vector 。我有一个字符串,其中包含循环通过的最终 svg 的路径的每一部分(由字符串中的“;”界定)。此外,我添加了 strokeLine
作为进度条来跟踪绘制了多少 vector 。
public void renderObject(GraphicsContext playGraphics, Canvas toUpdate)
{
playGraphics.beginPath();
String toAppend = "M 215 256; L 215 256; L 215 256; L 215 256; L 225 241; L 234 231; L 246 223; L 266 214; L 284 208; L 309 204; L 340 200; L 378 199; L 416 199; L 444 199; L 473 203; L 485 206; L 496 211; L 506 218; L 510 224; L 513 233; L 515 243; L 516 257; L 512 270; L 502 285; L 493 298; L 483 308; L 476 315; L 472 318; L 469 320; L 468 320; L 468 320; L 468 320; L 468 317; L 472 309; L 480 300; L 492 293; L 510 287; L 535 283; L 557 282; L 580 283; L 593 287; L 607 295; L 623 311; L 634 333; L 640 355; L 642 396; L 639 430; L 624 467; L 602 508; L 582 536; L 557 563; L 524 585; L 490 602; L 464 611; L 432 619; L 420 621; L 404 622; L 393 622; L 383 621; L 376 620; L 372 618; L 365 610; L 360 598; L 358 578; L 357 554; L 361 514; L 371 493; L 386 463; L 412 422; L 432 395; L 456 362; L 480 329; L 506 299; L 533 271; L 560 247; L 600 213; L 620 194; L 626 189; L 629 184; L 630 182; L 632 178";
for (int i=0; i < toAppend.split(";").length; i++)
{
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
playGraphics.clearRect(0, 0, toUpdate.getWidth(), toUpdate.getHeight());
playGraphics.strokeLine(50, 50, 50+10*i, 50);
playGraphics.appendSVGPath(toAppend.split(";")[i]);
playGraphics.stroke();
}
}
但是,一旦实现到实时 Canvas 上,就不会绘制 vector ,只有进度条可见。这是很奇怪的,因为渲染完成后,如果再次使用 graphicsContext
对象并调用另一个 playGraphics.stroke();
, vector 图像可以完整地显示在 Canvas 上。
为什么playGraphics.stroke();
运行失败但playGraphics.strokeLine
运行正常?
进度条指示正在渲染,但未显示 vector 奥 git _a进度条指示正在渲染,但未显示 vector 奥 git _a vector 最终被显示,但只有在 Canvas 上绘制一个点并重新调用 playGraphics.stroke();
最佳答案
当您调用 lines()
时,SVG 路径似乎以某种方式从当前路径中删除(此后它们无法附加到当前路径)。如果您仅在循环完成时调用 lines()
(我意识到这会破坏动画效果,因此不是解决方案),您的绘图将按预期显示。
由于您的 sleep 调用忽略了 JavaFX 的线程规则,因此情况变得更加复杂。您的 renderObject
方法是否在 JavaFX 应用程序线程中被调用?
sleep
调用将阻止事件处理,包括绘画。… Once a
Canvas
node is attached to a scene, it must be modified on the JavaFX Application Thread.Calling any method on the
GraphicsContext
is considered modifying its correspondingCanvas
and is subject to the same threading rules.
一旦您的 Canvas 显示出来,您就必须在应用程序线程中进行这些 GraphicsContext 调用。但是,你不能在应用程序线程中 hibernate ;这会导致所有 GUI 事件挂起,包括所有视觉更新和对用户输入的所有响应。
有几种方法可以正确地进行多线程处理。最简单的方法是创建一个新线程,其中允许 sleep
调用,同时确保使用 Platform.runLater 在 JavaFX 应用程序线程中进行 Canvas GraphicsContext 调用。
其他一些注意事项:
toAppend.split(";")
不是一个变量,它是一个昂贵的操作。并且您在每个循环迭代中重复该操作两次 !您应该在循环开始之前调用 split(";")
一次,并将返回的数组保留在变量中。 (JVM 可能能够在运行时进行此优化,但不能保证。)split
;您可以将所有 SVG 命令放入一个数组中,这样做的另一个好处是更易于阅读。因此,考虑到上述所有内容,您想要这样的东西:
public void renderObject(GraphicsContext playGraphics, Canvas toUpdate)
{
if (!Platform.isFxApplicationThread())
{
throw new IllegalStateException(
"Must be called in JavaFX application thread");
}
String[] toAppend = {
"M 215 256", "L 215 256", "L 215 256", "L 215 256",
"L 225 241", "L 234 231", "L 246 223", "L 266 214",
"L 284 208", "L 309 204", "L 340 200", "L 378 199",
"L 416 199", "L 444 199", "L 473 203", "L 485 206",
"L 496 211", "L 506 218", "L 510 224", "L 513 233",
"L 515 243", "L 516 257", "L 512 270", "L 502 285",
"L 493 298", "L 483 308", "L 476 315", "L 472 318",
"L 469 320", "L 468 320", "L 468 320", "L 468 320",
"L 468 317", "L 472 309", "L 480 300", "L 492 293",
"L 510 287", "L 535 283", "L 557 282", "L 580 283",
"L 593 287", "L 607 295", "L 623 311", "L 634 333",
"L 640 355", "L 642 396", "L 639 430", "L 624 467",
"L 602 508", "L 582 536", "L 557 563", "L 524 585",
"L 490 602", "L 464 611", "L 432 619", "L 420 621",
"L 404 622", "L 393 622", "L 383 621", "L 376 620",
"L 372 618", "L 365 610", "L 360 598", "L 358 578",
"L 357 554", "L 361 514", "L 371 493", "L 386 463",
"L 412 422", "L 432 395", "L 456 362", "L 480 329",
"L 506 299", "L 533 271", "L 560 247", "L 600 213",
"L 620 194", "L 626 189", "L 629 184", "L 630 182",
"L 632 178"
};
// If the SVG string is not hard-coded, create the array here:
// String[] toAppend = svgString.split(";");
Runnable pathBuilder = () -> {
try
{
StringBuilder path = new StringBuilder();
for (String segment : toAppend)
{
Thread.sleep(100);
path.append(" ").append(segment);
String pathToDraw = path.toString();
Platform.runLater(() -> {
playGraphics.beginPath();
playGraphics.appendSVGPath(pathToDraw);
playGraphics.stroke();
});
}
}
catch (InterruptedException e)
{
// Someone wants us to exit, so fall through and return.
e.printStackTrace();
}
};
Thread pathBuildingThread = new Thread(pathBuilder);
pathBuildingThread.setDaemon(true);
pathBuildingThread.start();
}
关于JavaFX Canvas appendSVG 路径渲染行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56605741/
在我的 OpenGL 程序中,我按顺序执行以下操作: // Drawing filled polyhedrons // Drawing points using GL_POINTS // Displa
我想传递一个包含原始页面的局部变量,这个变量只包含一个带有值的符号。 当我使用此代码时,它运行良好,可以在部分中访问 origin 变量: render :partial => "products",
为什么这个 HTML/脚本(来自“JavaScript Ninja 的 secret ”)不渲染? http://jsfiddle.net/BCL54/
我想在阅读完 View 后返回到特定的网页位置(跳转到页内 anchor )。换句话说,在 views.py 中,我想做类似的事情: context={'form':my_form} return r
我有一个包含单条折线的 PathGeometry,并以固定的间隔向该线添加一个新点(以绘制波形)。使用 Perforator 工具时,我可以看到每次向直线添加一个点时,WPF 都会将整个 PathGe
尝试了解如何消除或最小化网站上不同 JavaScript 库的渲染延迟。 例如,如果我想加载来自许多社交网络的“即时”关注按钮,它们似乎会相互阻止渲染,并且您会收到令人不快的弹出窗口。 (func
我有以 xyz 点格式表示 3D 表面(即地震断层平面)的数据。我想创建这些表面的 3D 表示。我使用 rgl 和 akima 取得了一些成功,但是它无法真正处理可能会自行折叠或在同一 x,y 点具有
我正在用 Libgdx 编写一个小游戏。 我有一个 Render[OpenGL] 线程,它不断对所有对象调用 render() 和一个更新线程不断对所有对象调用 update(double delta
我有一个 .Rmd 文件包含: ```{r, echo=FALSE, message=FALSE, results='asis'} library(xtable) print(xtable(group
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
请不要评判我,我只是在学习 Swift。 最近我安装了 MetalPetal 框架,并按照说明操作: https://github.com/MetalPetal/MetalPetal#example-
如果您尝试渲染 Canvas 宽度和高度之外的图像,计算机是否仍会尝试渲染它并使用资源来尝试渲染它?我只是想找出在尝试渲染图像之前检查图像是否在 Canvas 内是否更好。 最佳答案 我相信它仍然在无
我在 safari 中渲染时遇到问题。 在 firefox、chrome 和 IE 上。如下图所示: input.searchbox{-webkit-border-radius:10px;-moz-b
我正在尝试通过远程桌面在 Windows7 下运行我在 RHEL7 服务器中制作的 java 程序。 服务器中的所有java程序都无法通过远程桌面呈现。如果我在服务器位置访问服务器本身,它们看起来没问
我正处于一个新项目的设计阶段,该项目将采用数据集并将其加载到文档中,然后围绕模板呈现文档。呈现的文件可以是 CSV 数据集、PDF 营销信函、电子邮件……很多东西。数据不会是数学方程式,我只是在寻找一
有没有办法在不同的 div 下渲染 React 组件的子组件? ... ... ... ... ...
使用以下代码: import numpy as np from plotly.offline import iplot, init_notebook_mode import plotly.graph_
截至最近, meteor 的所有文档都指出 onRendered是一种在模板完成渲染时获取回调的新方法。和 rendered只是为了向后兼容。 但是,这似乎对我不起作用。 onRendered永远不会
所以在我的基本模板中,我有:{% render "EcsCrmBundle:Module:checkClock" %} 然后我创建了 ModuleController.php ... getDoctr
我正在使用 vue-mathjax 来编译我的 vue 项目中的数学方程。它正在编译第一个括号 () 之间的文本。我想防止编译括号内的字符串。在文档中我发现,对于$符号,如果我们想逃避编译,我们需要使
我是一名优秀的程序员,十分优秀!