我尝试在Android应用中显示1px细线,但FMX框架表现得很奇怪:线条经常被绘制得有点模糊,可以在屏幕上看到。即使在高分辨率屏幕上(在Ascend Mate 7上测试,它在16英寸显示器上具有FullHD 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/。这有点消除了bluring,但仍然使用超过1px绘制线条,我想在一个地方解决问题(我不能重写/重绘框架中的所有数百个组件)。
以下是上面屏幕截图中的示例项目:https://www.dropbox.com/s/le70jf601axd1xf/example.zip?dl=1
我用版本10.1(柏林)进行了测试,但这种奇怪的行为也发生在以前的版本中(只要我记得)。
答案 0 :(得分:0)
在Android上,你必须考虑几个想法。首先,它们是真实像素和虚拟像素(真实像素=虚拟像素x比例)。这意味着当你要求在XXhdpi设备上绘制1px线(比例= 3)时,你将有一条3px线将被绘制。当然,这不会导致模糊线,除了,如果比例是例如1.5
第二件事,连接到第一件事,如果你没有开始在真正的像素上画线。在android pos上是单一的,所以你可以在任何地方绘制线条,甚至在真实像素的中间。以这种方式,系统当然会开始模糊线条,将其从一个像素的中间绘制到另一个像素的中间(因为不能仅绘制一半像素)。为避免这种情况,请始终使用Canvas alignToPixel函数。
另一个认为你需要注意的是firemonkey框架使用了一个丑陋的设计参数:form.quality。当你将它设置为高质量时,使用的opengl将被设置为antiisisased所有东西(包括简单的线条),导致模糊。要删除它你可以将它设置为正常,但这样圆角/圆圈在比例为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