• 在 Maui 中自绘组件1:绘制


    在 Maui 中自绘组件 系列文章已完结,共六篇,此为第一篇。

    在这篇文章中,将自定义一个简单的按钮组件,绘制边框、背景、文字元素。

    GraphicsView

    Maui 中提供了 GraphicsView 视图,可通过继承 GraphicsView 视图来自定义组件。

    GraphicsView 中定义了类型为 IDrawable 的属性,在渲染时,将调用 IDrawable 中的 Draw 方法来绘制组件。

    创建 MagicButtonDrawable

    新建一个空的 Maui 项目,在项目根目录下创建 Components 文件夹,在其中创建 MagicButtonDrawable 类,并继承 IDrawableMagicButtonDrawable 将负责自定义组件的绘制。

    public class MagicButtonDrawable : IDrawable
    {
        public void Draw(ICanvas canvas, RectF dirtyRect)
        {
        }
    }
    

    绘制边框

    定义方法 DrawStroke 来绘制边框:

    public void DrawStroke(ICanvas canvas, RectF dirtyRect)
    {
        canvas.SaveState();
    
        canvas.SetFillPaint(new SolidPaint(Brush.LightBlue.Color), dirtyRect);
    
        canvas.FillRoundedRectangle(dirtyRect.X, dirtyRect.Y, dirtyRect.Width, dirtyRect.Height, dirtyRect.Height / 2);
    
        canvas.RestoreState();
    }
    

    在此方法中调用了 ICanvasFillRoundedRectangle 方法,绘制了一个填充色为 LightBlue 的圆角矩形。下一步将在此矩形之上,再绘制一个宽高小于此图案的不同填充色的圆角矩形,来实现边框的效果。

    绘制背景

    定义方法 DrawBackground 来绘制背景:

    public void DrawBackground(ICanvas canvas, RectF dirtyRect)
    {
        canvas.SaveState();
    
        canvas.SetFillPaint(new SolidPaint(Brush.Blue.Color), dirtyRect);
    
        var strokeThickness = 3;
        var x = dirtyRect.X + strokeThickness;
        var y = dirtyRect.Y + strokeThickness;
        var width = dirtyRect.Width - strokeThickness * 2;
        var height = dirtyRect.Height - strokeThickness * 2;
    
        canvas.FillRoundedRectangle(x, y, width, height, height / 2);
    
        canvas.RestoreState();
    }
    

    将边框厚度设为3,那么将绘制起始点的 X、Y坐标都加上边框的宽度, 并将宽度和高度都减去两个边框的厚度,来进行绘制,即可得到底层一个大的圆角矩形,其上一个略小的圆角矩形,从而实现边框的效果。

    dirtyRectXY 为绘制区域的左上角坐标,在 canvas 上进行绘制将根据 dirtyRectXY 从左上角开始绘制。

    绘制文本

    定义方法 DrawText 来绘制按钮中的文本内容:

    public void DrawText(ICanvas canvas, RectF dirtyRect)
    {
        canvas.SaveState();
    
        canvas.FontColor = Brush.White.Color;
        canvas.FontSize = 16;
        canvas.DrawString("Magic Button", dirtyRect.X, dirtyRect.Y, dirtyRect.Width, dirtyRect.Height,
            HorizontalAlignment.Center,
            VerticalAlignment.Center);
    
        canvas.RestoreState();
    }
    

    创建 MagicButton

    Components 文件夹中创建 MagicButton 类,并继承 GraphicsView。通过构造函数将 Drawable 属性设置为 MagicButtonDrawable 的实例。

    public class MagicButton : GraphicsView
    {
        public MagicButton()
        {
            Drawable = new MagicButtonDrawable();
        }
    }
    

    使用 MagicButton

    修改 MainPage.xaml 引用 MagicButton 名称空间,并添加 MagicButton 组件:

    
    
    <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 xmlns:components="clr-namespace:YOUR_MAGICBUTTON_NAMESPACE"
                 x:Class="YOUR_ROOT_NAMESAPCE.MainPage">
    
        <ScrollView>
            <VerticalStackLayout
                Spacing="25"
                Padding="30,0"
                VerticalOptions="Center">
    
                
    
                
                <components:MagicButton
                    HeightRequest="50"
                    WidthRequest="150">components:MagicButton>
    
                <Button
                    x:Name="CounterBtn"
                    Text="Click me"
                    SemanticProperties.Hint="Counts the number of times you click"
                    Clicked="OnCounterClicked"
                    HorizontalOptions="Center" />
    
            VerticalStackLayout>
        ScrollView>
    
    ContentPage>
    
    

    效果如下:

    custom button

    最终效果

    以下为五篇文章中功能全部实现的最终效果。

    custom button

    推荐阅读

    源码获取

    扫描下方二维码,关注公众号捕获异常,回复 maui 获取源码。

    捕获异常

  • 相关阅读:
    html中image 区域点击的优点
    初识MySQL
    Express框架
    【每日一题】掷骰子等于目标和的方法数
    计算机毕业设计之java+javaweb的校园音乐平台
    知识蒸馏 pytorch官网源码分析
    【halcon案例01 】金属工件几何测量
    Redis—Set类型以及常用命令
    低投入,高产出的数字人直播间软件强势“出圈”,铭顺科技带你一探究竟
    给CODER高手泼冷水
  • 原文地址:https://www.cnblogs.com/realZhangChi/p/17213812.html