FireMonkey绘制模糊线条

3
我尝试在Android应用程序中显示1像素细线,但FMX框架的行为很奇怪:线条经常会有一点模糊,在屏幕上可以看到。即使在高分辨率屏幕上(在Ascend Mate 7上测试,它具有16英寸显示器上的FullHD 1080x1920),也是明显的。无论我是否使用组件,例如TLine或TRectangle(没有边 - 只有Height = 1),还是在画布上自己画一条线(例如使用Canvas.Stroke.Thickness:= 1.0Canvas.DrawLine()),编译为Windows应用程序可以正确显示1px线条,但在Android上,线条被绘制为2px或有时为3px。有时候是介于两者之间的东西,比如一个实线和第二个半透明线。
很奇怪的是,当滚动包含这些线的视图(在运行时)时,线条的粗细似乎会改变。将线条粗细设置为小于值1.0可以真正绘制出1像素的线条,但是线条本身会变为透明。无论我尝试什么方法,都无法创建一个完全不透明的黑色实心1像素细线。而且上述问题(例如滚动时)仍然存在。更改TForm.Quality也没有帮助。本机Android应用程序似乎没有绘制细线的问题。

这里是本机截图(放大测量线条粗细):

enter image description here

我尝试了一些建议,比如“移动”这些行:http://sourceoddity.com/blog/2013/10/using-tcanvas-in-delphi-for-android/。这有助于消除模糊,但这些线仍然被画成超过1像素,而我希望在一个地方解决这个问题(我无法重写/重新绘制框架中的所有数百个组件)。
这是上面截图的示例项目:https://www.dropbox.com/s/le70jf601axd1xf/example.zip?dl=1 我测试了版本10.1(Berlin),但这种奇怪的行为也发生在以前的版本中(只要我记得)。

这个问题/答案讨论了1像素宽的虚线,但我记得对于1像素宽的实线也是一样的,将线段端点偏移0.5像素可以呈现真正的1像素宽水平和垂直线。 - Tom Brunberg
我已经尝试过这种方法了(在我的上面的文本中有博客链接)。它有助于消除模糊,但仍存在缩放问题。我开始意识到,FireMonkey似乎应用了Android系统的缩放。在我的华为Ascend Mate 7上,我在显示设置中有更改视图模式(缩放)的选项:小、中(默认)、大。TPlatformServices.Current.GetPlatformService(IFMXWindowService) as IFMXWindowServiceGetWindowScale() 给出以下值:2.5(小)、2.75(中)、3(大)。我可能错了,但我认为这可能是问题所在... - StanE
这意味着问题深层次地存在于FMX框架中。根据系统的缩放比例来缩放应用程序是有道理的。但是,如果每个设备都有不同的缩放比例,特别是使用分数,那么我认为我明白为什么会发生这种情况。如果FMX框架使用像2.75这样的比例来缩放整个应用程序,它是否会在渲染/抗锯齿方面出现问题?是否可能禁用缩放(如果确实是问题)? - StanE
1个回答

0
在Android上,您必须考虑几个因素。首先是实际像素和虚拟像素(实际像素=虚拟像素x比例)。这意味着当您要求在XXhdpi设备上绘制1px线条(比例为3)时,您将得到一个绘制的3px线条。当然,这不会导致模糊的线条,除非比例为1.5。
第二件事与第一件事相关,如果您不从实际像素开始绘制线条。在Android上,pos是单个的,因此您可以在任何地方绘制线条,甚至在实际像素的中间。以这种方式,系统当然会开始模糊线条,以便从一个像素的中心绘制到另一个像素的中心(因为不能只绘制半个像素)。为了避免这种情况,请始终使用Canvas alignToPixel函数。
您需要考虑的另一件事是Firemonkey框架使用一个丑陋的设计参数:form.quality。当您将其设置为高质量时,Firemonkey使用的OpenGL将被设置为抗锯齿所有内容(包括简单线条),导致模糊。要删除它,您可以将其设置为normal,但这样,在比例为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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接