首页 > 其他分享 >给我一块画布,我可以造一个全新的跨端UI

给我一块画布,我可以造一个全新的跨端UI

时间:2023-03-14 13:35:33浏览次数:37  
标签:动画 画布 UI 跨端 组件 new 绘制

一、源起

  作者是名超大龄程序员,曾涉及了包括Web端、桌面端、移动端等各类前端技术,深受这些前端技术的苦,主要但不限于:

  1. 每种技术编写代码的语言及技术完全不同,同样呈现形式的组件各端无法通用;
  2. 大部分前端开发语言跟后端开发语言不同,不能共用一些数据结构;

  前端UI的本质是在显示器上呈现由像素点组成的画面,并且响应外部输入事件作出相应的重绘。由于作者对Skia2D绘图引擎比较熟悉,又恰好可以借鉴一下Flutter引擎的跨端实现,所以作者动起了重新造一个跨端UI的念头。 阿基米德说过:“给我一个支点,我可以撬动地球”,那作者要说:"给我一块画布,我可以造一个全新的跨端UI"。

二、画布及画笔:

  有了画布才能绘制用户界面,目前画布的来源主要是两类:

  1. Web端参考Flutter的实现,利用编译为WebAssembly的CanvasKit提供;
  2. 桌面端及移动端参考Xamarin的实现,利用原生操作系统的视窗结合Skia的SkCanvas提供;

  每个窗体的画布分为两层,一层绘制Widget,另一层用于弹出层的绘制及一些组件装饰器的绘制。绘制引擎暂统一由Skia来处理,将来可能会考虑抽象绘制引擎。

三、组件树、布局及样式

  Flutter有三棵树,作者嫌啰嗦所以只有一棵WidgetTree,好处是实现简单且方便维持组件实例的状态。每个界面都由组件树结构组成。有些组件为布局类的(eg: Column、Stack等),具备单或多子组件;有些组件为叶子节点(eg: Text、PieChart等),通过设置相应的属性后直接绘制至画布。

四、组件状态

  实现组件时如果需要外部状态驱动,可以定义状态变量并绑定至组件的相关属性,这样当状态值发生变更时,绑定的组件根据状态影响进行重新布局或仅重新绘制。

public class DemoCounter : View 
{
    private readonly State<int> _counter = 0; //定义状态
    
    public DemoCounter() 
    {
        Child = new Column
        {
            Children = new Widget[]
            {
                new Text(_counter.AsStateOfString()/*绑定至组件*/),
                new Button("+") { OnTap = e => _counter.Value+=1/*改变状态值*/ }
            }
        };
    }
}

五、组件动画

  动画实现基本照搬Flutter的实现方式,由AnimationController在指定时间段内驱动各Animation的动画值变化,从而连续改变组件的状态值。

public class DemoAnimation : View
{
    private readonly AnimationController _controller;
    private readonly Animation<Offset> _offsetAnimation;
    
    public DemoAnimation()
    {
        _controller = new AnimationController(1000/*动画时长*/);
        _offsetAnimation = new OffsetTween(new Offset(-1, 0), new Offset(1, 0))
            .Animate(_controller); //位移变换并绑定至动画控制器
        
        Child = new Column
        {
            Children = new Widget[]
            {
                new Button("播放动画") { OnTap = e => _controller.Forward() },
                new SlideTransition(_offsetAnimation)
                {
                    Child = new Text("动画")
                }
            }
        };
    }
}

六、后续

  力量有限,在此抛砖引玉希望更多感兴趣的伙伴加入完善,也希望成为跟华为ArkUI类似的国产UI,对了暂时就叫PixUI吧。

标签:动画,画布,UI,跨端,组件,new,绘制
From: https://www.cnblogs.com/BaiCai/p/17214620.html

相关文章

  • 绝了!自动点赞,我用 PyAutoGUI!
    在之前文章​​中,我跟大家讲解了一下 ​​pyautogui​​ 的一些基础知识和操作,大家反馈很好,给了我好多赞,在此先跟大家说声三克油!在得到大家正反馈的同时,我受到了很大鼓舞,......
  • 简述HTTP1.0,1.1,2.0,3.0的主要区别以及QUIC协议
    HTTP/1.0(构建可拓展性)请求中新增协议版本信息引入HTTP头概念响应中新增状态码默认使用短连接:浏览器每使用一个静态资源就会建立连接直到任务结束中断连接HTTP/1.1......
  • PowerBuilder下的不同页面传参
    PB9.0下如何在两个不同页面传递参数源码代码位置:https://github.com/Glandom/PowerBuilder9.0Projects1..通过openwithparm(w_new,l_old)函数传递,Message.StringParm()函......
  • pyqt5 qt.ui文件转换为.py文件报错one input ui-file must be specified 解决方法
    我的原因是配置额外工具的时候忘记填写实参了,。,。,还有的老哥可能是.ui文件有空格,查资料的时候发现好像文件名有空格也不行"名称":这里可以自定义的"程序":选择的是"p......
  • UI自动化--下拉框处理和等待机制
    一、下拉框处理:网页上的js弹出框一般有三种情况,且识别不了元素,需要使用switch_to.alert()进行跳转    情况一: 这时候需要先跳转到此弹窗,才能做到自动化点击确......
  • SAP UI5 里一个功能的 compatibility version 是什么含义?
    在SAPUI5中,兼容版本(CompatibilityVersion)指的是应用程序在不同版本的SAPUI5中的运行兼容性。由于SAPUI5不断更新和演进,新版本可能会对应用程序的某些功能和接口......
  • [ChatGPT 勘误] SAP UI5 的 sap.ui.base.Object
    ChatGPT对SAPUI5sap.ui.base.Object作用的解答:在SAPUI5中,sap.ui.base.Object是所有UI5对象的基础类。该类提供了一个通用的、灵活的基础框架,可用于构建SAPUI5应......
  • 使用Argocd UI发布Guestbook
    1.ArgoCD核心概念Application:应用,一组由资源清单定义的Kubernetes资源,这是一个CRD资源对象Applicationsourcetype:用来构建应用的工具Targetstate:目标状态,指应用......
  • vue-cli-service build --mode 区分多个环境
    有些时候,我们的项目会打包部署到多个环境,可能在不同环境中,我们需要进行区分,做不同的操作,这时候我们可以利用打包的--mode。1.首先在package.json增加打包各模式的命令语......
  • 利用pip/conda安装库时,出现requires XXX, which is not installed/incompatible
    出现以下提示警告时step1step2step3总结利用pip/conda安装库时,出现requiresXXX,whichisnotinstalled/incompatible依次执行安装所缺的库即可(如有版本对应......