【发布时间】:2017-05-09 18:39:27
【问题描述】:
我尝试在 Android 应用中显示 1px 的细线,但 FMX 框架的行为很奇怪:线条经常画得有点模糊,可以在屏幕上看到。即使在高分辨率屏幕上(在 Ascend Mate 7 上进行测试,它在 16 英寸显示屏上具有全高清 1080x1920)也很明显。如果我使用一个组件,比如 TLine 或 TRectangle(没有边 - 只是 Height=1)或者我自己在画布上画一条线(例如使用Canvas.Stroke.Thickness := 1.0 和Canvas.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()ofTPlatformServices.Current.GetPlatformService(IFMXWindowService) as IFMXWindowService给了我以下值:2.5(小)、2.75(中)、3(大)。我可能错了,但我认为这可能是问题...... -
...这意味着问题存在于 FMX 框架的更深处。根据系统的扩展来扩展应用程序是有意义的。但是,如果每个设备都有不同的缩放比例,尤其是使用分数,那么我想我理解为什么会发生这种情况。如果 FMX 框架使用 2.75 之类的比例来缩放整个应用程序,它是否会出现渲染/抗锯齿问题?是否可以禁用缩放(如果确实是问题)?
标签: android delphi firemonkey