我创建了一个自定义视图(让我们称之为MyView),它基本上只是使用画布在自身上绘制一些文本.要绘制的文本使用全局变量设置.
在程序执行期间的某个时刻,我想要更改全局变量,并MyView重新绘制以更新文本.我试过findViewById()然后invalidate(),但这没有任何作用.我怀疑,由于内部没有任何MyView改变,它认为没有理由打电话onDraw().有没有办法强制View重绘自己,即使它认为它不需要?
如果我在浏览器中显示常规SVG(作为独立文件或嵌入HTML),那么在拥有大量独立路径元素和一个巨大路径元素之间,效率是否有任何理论差异?
我正在考虑从一张图片到一张完全不同的图片做某种动画.如果我可以只使用每个<path>标签绘制它们,那么它们之间的动画将更容易.然而,我担心如果路径太大,处理可能需要更长时间或效率更低.
我自己没有测试过这个问题,因为它需要手工连接很多路径,如果最终结果是非常低效,我不想浪费时间:-(
似乎无法在W3C或Mozilla上找到关于此文档的任何内容.任何评论赞赏.
我正在开发一个 Javascript 秒表应用程序,它适用于除 Chrome 之外的所有浏览器。
这是一个小提琴: http: //jsfiddle.net/djwelsh/Sxyy8/
理论上很简单。单击“开始”按钮会记录纪元时间(以毫秒为单位),并启动setInterval. 在每个时间间隔上,从当前纪元时间中减去起始纪元时间。这给我们留下了一个以毫秒为单位的值,该值将被转换h:m:s:cs并显示在页面上。
问题
我的问题是 Chrome 的问题。每次计时器达到 10000 毫秒时,选项卡就会崩溃并显示“噢,啪”消息。
一个奇怪的方面是,如果您点击“停止”,等待几秒钟,然后再次点击“开始” ,崩溃仍然会发生。这似乎表明这是一个内存问题——有些东西已经填满了,无法再容纳了,并且溢出了。但是在开发工具和资源监视器中检查内存并没有发现任何异常。
可能的解决方案
可以通过将间隔值更改为大于 100 毫秒的数字(我要使用的默认值是 50)来避免该问题。由于某种原因,也可以通过在控制台中记录计时器值来避免这种情况。
问题是,除非我知道为什么会发生这种情况,否则我不能确信这些快速修复方法实际上可以解决问题。在我知道该页面可以在所有当前浏览器中运行之前,我不想发布该页面。
我知道这似乎是一个范围相当狭窄的问题,但我希望解决方案能够揭示一些更大范围的内容,可能会帮助其他人(Chrome 的计时器功能或其他功能的特质)。
编辑 顺便说一句,我知道停止和重新启动计时器并不像真正的秒表中应有的那样工作;我还没有完成那部分的实现。我认为对于 SO 来说,让它尽可能简单会更好。
作为参考(和伟大的正义),这里是更新版本。在 10000 时仍然崩溃: http://jsfiddle.net/djwelsh/Sxyy8/7/
解决方案 根据@Akhlesh的回答,我更新了小提琴。它现在可以正常运行并且就像秒表一样:http ://jsfiddle.net/djwelsh/Sxyy8/18/
如果您想知道,我需要使用基于纪元的技术(而不是仅增加基值),因为有时内存使用问题会导致每秒不调用间隔 - 如果选项卡移至后台,而例如,计时器仍在运行。
这似乎是一个相当基本的问题,我提前道歉.
我正在编写一个使用一组预定义数字的Android应用程序.目前我正在使用int值,但在某些时候我可能也需要使用float和double值.
这些数字用于两件事.首先,我需要将它们显示给用户,我需要一个String(我正在创建一个自定义View并绘制String一个Canvas).其次,我需要在一种计算器中使用它们,它们显然需要int(或float/ double).
由于数字是相同的,无论它们是用作String还是int,我只想存储一次(如果我需要更改任何一个,这也会减少错误;我只需要在一个地方更改它们).
我的问题是:我应该将它们存储为String或作为int?它更快写的int作为String,或来解析int从String?我的直觉告诉我解析需要更多时间/资源,所以我应该将它们存储为ints.我对吗?
我目前正在创建一个canvas基于HTML5 的绘图程序.用户可以绘制图像或几个"页面"图像,并将其保存到云中以便以后快速检索.这适用于交互式白板; 老师不能总是确定他们计划上课的IWB是他们将在该课程中使用的那个,所以我想让数据可以从任何地方访问.
我通过Ajax将画布数据作为数据URI发送到服务器,将数据存储在文件系统中,并在数据库中存储对文件的引用.我的问题是,我不确定这些图像最终会占用多少文件系统空间.
这些文件保存为带有Alpha透明层的PNG,并且为1280x720px.根据绘制的内容,文件大小会有很大差异,我认为这是因为PNG是压缩的.因此,我无法计算出这样的图像可能存在的最大文件大小.由于我想假设最坏情况,我假设PNG压缩不会减少文件大小.鉴于此,最大文件大小是:
1280 x 720 x colordepth
Run Code Online (Sandbox Code Playgroud)
?如果是这样,在colordepth我使用导出图像的情况下应该是什么值canvas.toDataURL()?它会根据浏览器的实现而有所不同canvas吗?我完全在黑暗中.
我知道PNG压缩对照片风格的图像效果不佳,所以我一直在尝试创建一些不易压缩的东西(主要是柔和的,相当随机的渐变).我能够创建的最大值约为675KB,但我确信它远不及潜在的最大尺寸.
所以我要么知道最大文件大小是什么,或者什么样的图像在PNG中提供压缩的可能性最小,所以我可以更好地进行实验.
我希望这是有道理的.
SO上有一些类似的问题:
但似乎没有人回答我的问题.如果我错过了什么,请告诉我.
UPDATE
我试过Ken Fyrstenberg的想法,初步结果很有意义.将图像存储为序列化对象会导致一组数据小于等效dataURL字符串的四分之一.这是在我开始优化它之前.我强烈建议任何处于类似情况的人都试试这种方法.
另一个更新
当我第一次开始这个时,我正在使用SVG.但是,用户绘制的越多DOMElement,一次必须在屏幕上显示的s 越多,响应时间变得越慢(尤其是> 1000个元素).我曾经假设用画布做这件事,并在用户制作时将每个笔画存储在一个数组中,会出现类似的问题."不是这样.
我想,与跟踪DOM元素及其所有属性,文档中的位置以及与其他元素的关系相比,简单地存储路径数据的开销要少得多.
Upshot是,无论我多少次插入阵列,重绘操作总是闪电般快速.除了在存储数据以供以后使用时上述尺寸的减小,以及非常容易实现撤销/重做之外.现在对Javascript和canvas印象非常深刻.
我有一张地图.我希望用户能够缩放和平移地图.想象一下谷歌地图,但不是无限地平移,地图是一个正方形(如果你超越它的边缘,它不会再次环绕).
我使用scale()和实现了缩放和平移translate().这些都很好用.
我被困在最后一部分 - 当用户放大时,我想围绕该点居中放大.很难用文字解释,所以想象一下当你在谷歌地图中鼠标轮时会发生什么 - 这就是我想要的.
我已经在标题中查看了关于SO的每个答案.大多数是这个的变体,基本上说这是我需要做的:
ctx.translate(/* to the point where the mouse is */);
ctx.scale(/* to zoom level I want */)
ctx.translate(/* back to the point where the mouse was, taking zoom into account */);
Run Code Online (Sandbox Code Playgroud)
然而,无论我做什么,我似乎无法让它工作.我可以让它在缩放后缩放到特定点,但无论我做什么,我都无法使该点等于鼠标指针所在的位置.
看看这个小提琴.想象一下,广场是一张地图,圆圈是国家或其他什么.
我找到的最佳实现是这个SO答案和链接的例子.但是,代码使用了SVG和.createSVGMatrix()各种各样的东西,坦率地说,我无法理解.如果可能的话,我更喜欢全画布解决方案.
显然我对使用库这样做不感兴趣.我想明白为什么我所做的不起作用.
android ×2
java ×2
canvas ×1
crash ×1
filesize ×1
html5-canvas ×1
javascript ×1
panning ×1
png ×1
setinterval ×1
svg ×1
zoom ×1