namespace JiDangJia.Views; public sealed class RibbonDrawable : IDrawable { public void Draw(ICanvas c,RectF r) { c.StrokeSize=.65f; for(int i=0;i<8;i++) {c.StrokeColor=Ui.Gold.WithAlpha(.05f+i*.008f);var p=new PathF();p.MoveTo(r.Width*.3f,r.Height+40);p.CurveTo(r.Width*.76f,r.Height+i*5,r.Width*.72f,r.Height*.5f+i*5,r.Width+100,15+i*8);c.DrawPath(p);} } } public sealed class AdDrawable : IDrawable { public void Draw(ICanvas c,RectF r) { c.StrokeColor=Ui.Bronze.WithAlpha(.17f);c.StrokeSize=1; for(int i=0;i<5;i++)c.DrawCircle(r.Width-20,r.Height/2,35+i*20); c.StrokeColor=Ui.Bronze.WithAlpha(.5f);c.StrokeSize=1.5f;var p=new PathF();float x=r.Width-63,y=r.Height/2;p.MoveTo(x-25,y-6);p.LineTo(x,y-25);p.LineTo(x+25,y-6);c.DrawPath(p);c.DrawRoundedRectangle(x-18,y-6,36,37,3);c.DrawLine(x-9,y+6,x+9,y+6);c.DrawLine(x-9,y+15,x+9,y+15);c.DrawLine(x,y,x,y+25); } } public sealed class IncomeDrawable(IReadOnlyList<(string label,decimal value)> data) : IDrawable { public void Draw(ICanvas c,RectF r) { float baseline=r.Height-27,top=24;decimal max=Math.Max(1,data.Max(p=>p.value));c.FontSize=10;c.FontColor=Ui.Muted;c.StrokeColor=Ui.Line;c.StrokeSize=1; for(int i=0;i<3;i++){float y=top+i*(baseline-top)/2;c.DrawLine(0,y,r.Width,y);} float cell=r.Width/data.Count; for(int i=0;i0)c.FillRoundedRectangle(x,baseline-height,cell*.5f,height,4);c.DrawString(data[i].label,i*cell,baseline+10,cell,16,HorizontalAlignment.Center,VerticalAlignment.Center);if(data[i].value>0)c.DrawString(data[i].value.ToString("0.##"),i*cell,baseline-height-18,cell,15,HorizontalAlignment.Center,VerticalAlignment.Center);} if(data.All(p=>p.value==0)) {c.FontColor=Ui.Muted;c.FontSize=12;c.DrawString("暂无收入数据",0,60,r.Width,30,HorizontalAlignment.Center,VerticalAlignment.Center);} } }