gpt4 book ai didi

android - FireMonkey 绘制模糊线条

转载 作者:行者123 更新时间:2023-11-29 02:41:17 37 4
gpt4 key购买 nike

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

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

下面是原生截图(放大测量线宽):

enter image description here

我尝试了一些建议,比如“移动”这些行: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 版(柏林)对此进行了测试,但这种奇怪的行为也发生在以前的版本中(只要我记得)。

最佳答案

在 Android 上,您必须考虑多种因素。首先是真实像素和虚拟像素(真实像素 = 虚拟像素 x 比例)。这意味着当您要求在 XXhdpi 设备上绘制一条 1px 的线(比例 = 3)时,您将绘制一条 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

关于android - FireMonkey 绘制模糊线条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43877519/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com