只需创建简单的FireMokey HD应用程序,在表单上放置带有align = alclient的TImage并尝试绘制简单的黑色矩形:
procedure TForm8.FormCreate(Sender: TObject);
var
c: TCanvas;
begin
Image.Bitmap := TBitmap.Create(ClientWidth, ClientHeight);
c := Image.Bitmap.Canvas;
c.BeginScene;
try
c.Clear(claWhite);
c.Stroke.Color := claBlack;
c.Stroke.Kind := TBrushKind.bkSolid;
c.DrawRect(
TRectF.Create(7,7,ClientWidth-7,ClientHeight-7),
0,0,
[],
1
);
finally
c.EndScene;
end;
end;
它不起作用。矩形的颜色不是黑色,它是一种灰色。角落里的颜色有些变化。我需要设置一些其他属性或这里有什么问题吗? 我尝试了不同的不透明度值(1,100,255,65535),图片根本没有变化,并且帮助中没有信息这个选项意味着什么。 放大左上角:
还尝试使用如示例中所述的多边形。同样的问题 - 圆角和灰色而不是黑色(图像的不透明度属性为1,默认情况下所有属性):
procedure TForm8.Button2Click(Sender: TObject);
var
p1, p2, p3, p4, p5: TPointF;
MyPolygon: TPolygon;
begin
// sets the points that define the polygon
p1.Create(100, 100);
p2.Create(200, 100);
p3.Create(200, 200);
p4.Create(100, 200);
p5.Create(100, 100);
// creates the polygon
SetLength(MyPolygon, 5);
MyPolygon[0] := p1;
MyPolygon[1] := p2;
MyPolygon[2] := p3;
MyPolygon[3] := p4;
MyPolygon[4] := p5;
Image.Bitmap.Canvas.BeginScene;
// draws the polygon on the canvas
Image.Bitmap.Canvas.DrawPolygon(MyPolygon, 50);
Image.Bitmap.Canvas.EndScene;
// updates the bitmap
// Image.Bitmap.BitmapChanged;
end;
答案 0 :(得分:1)
http://roman.yankovsky.me/?p=1018
if Canvas.BeginScene then
try
Canvas.Stroke.Thickness := 1.5;
Canvas.Stroke.Kind := TBrushKind.bkSolid;
Canvas.Fill.Color := TAlphaColorRec.Black;
Canvas.Fill.Kind := TBrushKind.bkSolid;
for I := 1 to 9 do
begin
Canvas.DrawLine(PointF(50 + I * 25 - (Canvas.Stroke.Thickness / 2), 0),
PointF(50 + I * 25 - (Canvas.Stroke.Thickness / 2), ClientHeight), 1);
end;
finally
Canvas.EndScene;
end;
答案 1 :(得分:0)
一旦您了解了 Firemonkey 的更好范式,这个问题就很容易解决。 Firemonkey 使用实坐标,而不是整数坐标。您不知不觉地告诉它以像素之间的边界为中心绘制线条,因此您的每条线条一半在一组像素中,一半在另一组像素中。
具体来说,发生的情况是您的整数坐标被解释为连续数轴上的精确中心点。例如,假设点是 7。以 7.0 点为中心的宽度为 1 的线将从数轴上的 6.5 延伸到 7.5。但是因为像素在数轴上从 6.0 延伸到 6.99,从 7.0 延伸到 7.99,所以每个像素都是一半黑一半白。自动抗锯齿导致它们被绘制为 50% 的黑色,这就是两像素宽灰色的来源。
在使用 FMX(现在称为 FMX)时,您必须将您的想法从整数坐标转换为实坐标,后者更加复杂和强大。
最简单的解决方案是将基于整数的数学向右移动 0.5,向下移动 0.5。然后 7.5 处的 1 像素宽线将从 7.0 延伸到 7.999,这正是您所期望的。为此,只需在发出绘图命令时将 0.5 添加到所有像素坐标,包括水平和垂直。
好消息是,0.8 像素宽或 1.5 像素宽的线条会自动分别显得更细或更粗。对角线和其他曲线看起来是正确的,没有锯齿状边缘。您可以缩放复杂的绘图,它们在任何缩放级别下看起来都很完美。 (半像素偏移的数学计算对于所有缩放级别都保持不变。在绘制线条之前缩放后立即添加 0.5。)
以上适用于所有设备:屏幕、位图和打印机等。因此,在屏幕上绘制的相同代码可用于绘制其他所有设备。绘制文本时,您可以对字体使用小数点大小,以便它们与其他所有内容一起缩放。