<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      給我一塊畫布,我可以造一個全新的跨端UI

      一、源起

      ??作者是名超大齡程序員,曾涉及了包括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 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 Button("播放動畫") { OnTap = e => _controller.Forward() },
                      new SlideTransition(_offsetAnimation)
                      {
                          Child = new Text("動畫")
                      }
                  }
              };
          }
      }
      

      六、后續

      ??力量有限,在此拋磚引玉希望更多感興趣的伙伴加入完善,也希望成為跟華為ArkUI類似的國產UI,對了暫時就叫PixUI吧。

      posted @ 2023-03-14 13:21  白菜園  閱讀(2195)  評論(11)    收藏  舉報
      主站蜘蛛池模板: 麻豆久久天天躁夜夜狠狠躁| 无码h片在线观看网站| 日韩深夜福利视频在线观看| 亚洲国产午夜精品福利| 久久99久久99精品免观看| 国内少妇人妻偷人精品| 人妻日韩精品中文字幕| 欧美综合区自拍亚洲综合绿色| 国产精品爱久久久久久久| 女人腿张开让男人桶爽| 国产亚洲一区二区三区成人| 亚洲精品一区二区三区中文字幕| 视频一区二区不中文字幕| 精品午夜福利短视频一区| 亚洲精品久久麻豆蜜桃| 久青草国产在视频在线观看| 逊克县| 亚洲岛国成人免费av| 精品午夜福利短视频一区| 国产一区二区在线观看粉嫩| 久久精品无码一区二区小草| 午夜通通国产精品福利| 一区二区三区四区五区自拍| 国产超碰人人做人人爱ⅴa| 日韩人妻无码精品专区综合网| 青青青国产在线观看免费| 亚洲精品天堂在线观看| 久久涩综合一区二区三区| 无码精品人妻一区二区三区湄公河| 久久青草国产精品一区| 国产精品乱码人妻一区二区三区| 日韩午夜无码精品试看| 亚洲VA欧美VA国产综合| 亚洲精品无码成人A片九色播放| 国产一国产精品免费播放| 成人性生交大片免费看r老牛网站| 中文字幕人妻中文AV不卡专区| 日韩人妻少妇一区二区三区 | 欧美黑人性暴力猛交在线视频| 亚洲综合精品第一页| 亚洲国产精品日韩av专区|