gpt4 book ai didi

paintcode - PaintCode绘图代码android使用像素而不是点/DP

转载 作者:行者123 更新时间:2023-12-03 06:46:36 26 4
gpt4 key购买 nike

注意:是的,我知道Android中还有其他处理按钮的方法,但这只是一个示例来说明我的问题(实际的按钮要复杂得多)。因此,请不要在为Android中的按钮提供其他解决方案时回信,我正在寻找PaintCode的解决方案...

多年来,我一直使用PaintCode在iOS中绘制自定义按钮,效果非常好。我想对android做同样的事情,并遇到以下问题:


在PaintCode中,我绘制了一个按钮,该按钮基本上是一个半径为20点的圆角矩形。
我画了一个框,然后使用弹簧设置正确的尺寸调整行为(请参见屏幕截图)。
结果是,无论按钮的大小如何(=框架),拐角处的圆角总是很好地舍入为20点。基本上是一个可调整大小的按钮。


这在iOS上效果很好,但在android上,半径为20像素而不是点,导致半径很小到很小(现在使用高分辨率设备)。

或通常,当我使用PaintCode生成的draw方法绘制时,我在PaintCode中制作的所有图形都很小。

它表明生成的绘图代码未考虑设备的比例(就像在iOS上一样)。

enter image description here

查看https://www.paintcodeapp.com/documentation/android部分“缩放”,PaintCode建议使用android中的密度指标来执行缩放。
这确实有效,但是会使生成的图形变得模糊,我猜这是因为缩放导致我们以较低的分辨率进行绘制。因此,这不是可行的解决方案。

class Button1 @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : Button(context, attrs, defStyleAttr) {

var frame = RectF()

override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
val displayDensity = resources.displayMetrics.density
canvas?.scale(displayDensity, displayDensity)
frame.set(0f,0f,width.toFloat()/displayDensity,height.toFloat()/displayDensity)
StyleKitName.drawButton1(canvas, frame)
}
}


有什么建议可以解决这个问题吗?这是PaintCode中的错误吗?

最佳答案

我是开发商。很抱歉,答案很长。

TLDR:自己处理扩展,例如您的方式。将View的layerType切换到软件以避免缩放结果模糊。

首先,我完全理解这种困惑,对于iOS而言,它只是可行的,而在Android中,您必须在某些范围上摆弄。如果它能以我喜欢的方式以及其他PaintCode用户同样的方式工作,那将更加有意义。但这不是错误。问题是UIKit和android.graphic之间的区别。

在UIKit中,距离以点为单位。这意味着,如果您绘制一个直径为40点的圆,则在各种iOS设备上,它的大小应该或更小。 PaintCode采用了这种约定,并且您在PaintCode用户界面中看到的所有数字(例如形状的位置,笔触宽度或半径)都以点为单位。 PaintCode生成的绘图代码不仅与分辨率无关(即您可以调整其大小/缩放比例并保持清晰度),而且与显示密度无关(在视网膜显示器,常规显示器和视网膜高清显示器上渲染大致相同的尺寸)。而且代码没有什么特别的。看起来像这样:

NSBezierPath* rectanglePath = [NSBezierPath bezierPathWithRect: NSMakeRect(0, 0, 100, 50)];
[NSColor.grayColor setFill];
[rectanglePath fill];


因此,显示缩放比例由UIKit处理。隐式比例也取决于上下文。如果您在某些UIView子类的drawRect:中调用绘图代码,则它将采用显示密度,但如果在自定义UIImage中进行绘图,则它将采用该图像的密度。魔法。

然后,我们添加了对Android的支持。 android.graphic中的所有度量均以像素表示。 Android并没有执行UIKit的“显示密度”魔术。同样,没有一种好的方法来找出绘图代码范围内的密度。您需要为此访问资源。因此我们可以将其作为参数添加到所有绘图方法中。但是,如果您不打算将图形发布到显示器上,而是要创建图像(将发送给您的朋友或其他对象)怎么办?然后,您不需要显示密度,而是图像密度。
好的,因此,如果添加参数,我们不应该添加资源,而应将密度本身作为浮点数并在每种绘制方法中生成比例。现在,如果您真的不关心密度怎么办?如果您只关心图形填充某个矩形并具有最佳分辨率该怎么办?实际上,我认为通常是这种情况。在我看来,拥有这么多不同的显示分辨率和显示密度使“一种物理尺寸的元件适合所有人”的方法显得微不足道。因此,在大多数情况下,密度参数是多余的。我们决定将秤的处理方式留给用户。

现在考虑缩放图纸的模糊性。这是UIKit和android.graphics之间的另一个区别。所有开发人员都应该了解,在渲染具有多个对象的大型场景时,CoreGraphics并不是很快。如果您对性能敏感的应用进行编程,则可能应该考虑使用SpriteKit或Metal。这样做的好处是,您不受CoreGraphics的限制,几乎总是可以得到非常准确的结果。缩放就是这样一个例子。您可以应用巨大的规模,结果仍然清晰。如果您想要更多的硬件加速,请使用其他API并自己处理限制(例如,您的GPU中可以容纳多大的纹理)。

Android走了另一条路。他们的android.graphic api可以在两种模式下工作-没有硬件加速(它们称为软件)或具有硬件加速(它们称为硬件)。它仍然是相同的API,但是其中一种硬件模式有一些明显的限制。这包括缩放,模糊(因此有阴影),某些混合模式等等。
https://developer.android.com/guide/topics/graphics/hardware-accel.html#unsupported

并且他们决定,如果目标API级别> = 14,则默认情况下,每个视图都将使用硬件模式。您当然可以将其关闭,并且神奇地,缩放后的按钮也将漂亮而清晰。

我们提到您需要在我们的文档页面“层的类型” https://www.paintcodeapp.com/documentation/android中关闭硬件加速。
而且它也在Android文档 https://developer.android.com/guide/topics/graphics/hardware-accel.html#controlling

关于paintcode - PaintCode绘图代码android使用像素而不是点/DP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46451186/

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