在firemonkey中,我正在尝试使用带圆角的矩形制作进度条。最简单的情况是一个矩形(进度条)和其中的第二个矩形(进展到现在)。附上一个简单的例子。
带角落的进度条(绘画):
我尝试了以下方法:
有什么作用:
这是我们可以避免的,或者这是唯一可行的解决方案吗?
进度条目标(绘画):
提前谢谢!
扬
答案 0 :(得分:4)
我不确定你的意思
使用clipchildren。这与在html / css中隐藏溢出几乎相同,但Delphi在此函数中不包括圆角。
我通过使用一个Rectangle作为边框来实现这一点;在那个进程的布局之上,其中包含另一个Rectangle。第二个Rectangle总是具有第一个的尺寸(这意味着角看起来相同),Layout ClipChildren
设置为true
,并且通过设置其{{{}来控制进度1}}。
以下是我实施的方式:
Width
答案 1 :(得分:1)
正是clipchildren无法工作,因为它使用了控件的边界框(所以是一个Rectf)。但你可以做什么:
1)覆盖trectangle的onpaint(非常简单)
2)使用2个Trectangles(称为橙色和白色),在您设置为不绘制左侧(通过Trectangle的Sides属性)的第一个tRectangle(橙色)和您设置为的第二个Trectangle(白色)上不画右侧(也可以通过侧面属性)。将这2个Trectangles放入Tlayout(或任何其他您想要的容器)中,将第二个Trectangle(白色)的对齐设置为all,将第一个Trectangle(橙色)对齐到ALleft。之后你只需要说MyOrangeRect.width:= XX其中xx你的进度相对于容器的进度当然
答案 2 :(得分:1)
我喜欢只用一个TRectangle来填充另一个解决方案:
只需添加一个TRectangle,设置边框,角落并将填充属性设置为TBitmap。
现在,您可以在运行时创建一个颜色(宽度为进度)的TBitmap到fill.bitmap.bitmap(注意双位图)属性。
你的角落仍然受到尊重。
额外:您还可以使用在photoshop中创建的一个垂直线位图,具有漂亮的发光/颜色效果,如IOS电池进度条,并在您的TRectangle中拉伸。
答案 3 :(得分:0)
只需像这样使用形状(圆形):
procedure TForm4.SpinBox1Change(Sender: TObject);
begin
roundrect2.Width:=strtoint(SpinBox1.Text);
end;
如果想要进一步提高,请更改上部形状的宽度属性;
答案 4 :(得分:0)
当在内部绘制TRectangle时,它实际上会创建一个路径。
最好的解决方案是创建一个自定义组件,其中包含两个TPathData
(称为 PathBackground 和 PathFill ),这些组件已重新计算百分比变化时和调整大小时。
在Paint例程中,我会用这种方式绘制
Canvas.FillPath(PathBackground, ...);
Canvas.FillPath(PathFill, ...);
Canvas.DrawPath(PathBackground, ...);
通过绘制边缘作为最后一件事,可以避免渲染错误。