【问题标题】:FireMonkey draws blurred linesFireMonkey 画出模糊的线条
【发布时间】:2017-05-09 18:39:27
【问题描述】:

我尝试在 Android 应用中显示 1px 的细线,但 FMX 框架的行为很奇怪:线条经常画得有点模糊,可以在屏幕上看到。即使在高分辨率屏幕上(在 Ascend Mate 7 上进行测试,它在 16 英寸显示屏上具有全高清 1080x1920)也很明显。如果我使用一个组件,比如 TLine 或 TRectangle(没有边 - 只是 Height=1)或者我自己在画布上画一条线(例如使用Canvas.Stroke.Thickness := 1.0Canvas.DrawLine()),这并不重要。编译为 Windows 应用程序可以正确显示 1px 的线条,但在 Android 上,线条被绘制为 2px 或有时为 3px。有时介于它之间,例如一条实线和另一半透明线。

同样奇怪的是,当滚动包含线条的视图(在运行时)时,绘制的线条粗细似乎发生了变化。将粗细设置为低于1.0 允许绘制线条实际上为1px,但线条本身会变得透明。无论我尝试什么 - 我都无法创建一条 1px 细且完全不透明的黑线。并且上述问题(例如滚动时)仍然存在。更改 TForm.Quality 也无济于事。原生 Android 应用似乎没有画细线的问题。

这是一个原生截图(放大以测量线条粗细):

我尝试了一些建议,例如“移动”这些行:http://sourceoddity.com/blog/2013/10/using-tcanvas-in-delphi-for-android/。这有助于消除模糊,但线条仍然超过 1px,我想在一个地方解决问题(我无法重写/重绘框架中的所有数百个组件)。

这是上面截图中的示例项目:https://www.dropbox.com/s/le70jf601axd1xf/example.zip?dl=1

我用 10.1 版(柏林)对此进行了测试,但这种奇怪的行为也发生在以前的版本中(只要我记得)。

【问题讨论】:

  • This question/answer 说的是 1 px 宽的虚线,但我记得 1 px 宽的实线是一样的,用 0.5 px 偏移线端会导致渲染真正的 1 px 宽水平和垂直线。
  • 我已经尝试过这种方法(我上面文本中的博客链接)。它有助于消除模糊,但仍然存在缩放问题。我开始意识到,firemonkey 似乎适用于 Android 系统的缩放。在我的华为 Ascend Mate 7 上,我在显示设置中有更改视图模式(缩放)的选项:小、中(默认)、大。 GetWindowScale() of TPlatformServices.Current.GetPlatformService(IFMXWindowService) as IFMXWindowService 给了我以下值:2.5(小)、2.75(中)、3(大)。我可能错了,但我认为这可能是问题......
  • ...这意味着问题存在于 FMX 框架的更深处。根据系统的扩展来扩展应用程序是有意义的。但是,如果每个设备都有不同的缩放比例,尤其是使用分数,那么我想我理解为什么会发生这种情况。如果 FMX 框架使用 2.75 之类的比例来缩放整个应用程序,它是否会出现渲染/抗锯齿问题?是否可以禁用缩放(如果确实是问题)?

标签: android delphi firemonkey


【解决方案1】:

在 android 上,您必须考虑几个方面。首先它们是真实像素和虚拟像素(真实像素=虚拟像素x比例)。这意味着当您要求在 XXhdpi 设备(比例 = 3)上绘制一条 1px 的线时,您将绘制一条 3px 的线。当然这不会导致线条模糊,除了如果比例是例如 1.5

第二件事,连接到第一件事,如果你没有开始在真实像素上画线。在 android 上 pos 是一个单一的,所以你可以在任何地方画你的线,甚至在一个真实像素的中间。这样,系统当然会开始模糊线以将其从一个像素的中间绘制到另一个像素的中间(因为不能只绘制一个像素的一半)。为了避免这种情况,请始终使用 Canvas alignToPixel 函数。

您需要注意的另一个问题是 firemonkey 框架使用了一个丑陋的设计参数:form.quality。当您将其设置为高质量时,用于 firemonkey 的 opengl 将设置为对所有内容(包括简单线)进行抗锯齿处理,从而导致模糊。要删除它,您可以将其设置为正常,但这样圆角/圆形在比例为 1 的设备上绝对难看。

我个人选择的选项是保持 form.quality = low(无抗锯齿)并使用 android api 自己绘制所有内容(包括线条、矩形等)。你可以看看这个 svn:https://svn.code.sf.net/p/alcinoe/code/ 或者如果你想直接在 android 中看到加载这个演示:https://svn.code.sf.net/p/alcinoe/code/demos/ALFmxControls/Android/Release/ALFmxControls/bin/ALFmxControls.apk

【讨论】:

    猜你喜欢
    • 2014-04-20
    • 1970-01-01
    • 2016-05-08
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多