跨平台自适应布局yoga特性详解

yoga是facebook打造的一个跨IOS、Android、Window平台在内的布局引擎,兼容Flexbox布局方式,让界面更加简单。

Yoga官网:https://facebook.github.io/yoga/

官网上描述的特性包括:

  • 完全兼容Flexbox布局,遵循W3C的规范
  • 支持java、C#、Objective-C、C四种语言
  • 底层代码使用C语言编写,性能不是问题
  • 支持流行框架如React Native

目前在已开源的鸿蒙组件(https://gitee.com/openharmony-tpc/yoga)的功能现状如下:

  • native层和接口已经打通
  • 支持自定义xml属性来控制布局(通过YogaLayout)
  • 设置布局中不支持Image控件(onDrawCanvas暂不支持主动回调,所以yoga没办法扫描到它),请使用Text控件替代
  • 不支持VirtualYogaLayout

如何使用

首先我们在MainAbility中定义界面路由。


  1. public class MainAbility extends Ability { 
  2.     @Override 
  3.     public void onStart(Intent intent) { 
  4.         super.onStart(intent); 
  5.         super.setMainRoute(MainAbilitySlice.class.getName()); 
  6.         addActionRoute("action.dydrawnode.slice", DynamicsDrawNodeSlice.class.getName()); 
  7.         addActionRoute("action.showrow.slice", ShowRowAbilitySlice.class.getName()); 
  8.         addActionRoute("action.inflate.slice", BenchmarkInflateAbilitySlice.class.getName()); 
  9.     } 

然后我们来到MainAbilitySlice,其实就是做了一个向其他界面跳转的动作,并提前加载yoga的so库。


  1. public class MainAbilitySlice extends AbilitySlice { 
  2.  
  3.  
  4.  
  5.     static { 
  6.         System.loadLibrary("yoga"); 
  7.         System.loadLibrary("yogacore"); 
  8.         System.loadLibrary("fb"); 
  9.     } 
  10.  
  11.  
  12.  
  13.     @Override 
  14.     public void onStart(Intent intent) { 
  15.         super.onStart(intent); 
  16.         setUIContent(ResourceTable.Layout_main_layout); 
  17.  
  18.         Button btn0= (Button) findComponentById(ResourceTable.Id_btn_1); 
  19.         btn0.setClickedListener(component -> { 
  20.             Intent intent1 = new Intent(); 
  21.             Operation operation = new Intent.OperationBuilder() 
  22.                     .withAction("action.dydrawnode.slice"
  23.                     .build(); 
  24.             intent1.setOperation(operation); 
  25.             startAbilityForResult(intent1, 1); 
  26.         }); 
  27.  
  28.         Button btn2= (Button) findComponentById(ResourceTable.Id_btn_2); 
  29.         btn2.setClickedListener(component -> { 
  30.             Intent intent1 = new Intent(); 
  31.             Operation operation = new Intent.OperationBuilder() 
  32.                     .withAction("action.showrow.slice"
  33.                     .build(); 
  34.             intent1.setOperation(operation); 
  35.             startAbilityForResult(intent1, 1); 
  36.         }); 
  37.  
  38.         Button btn1= (Button) findComponentById(ResourceTable.Id_btn_3); 
  39.         btn1.setClickedListener(component -> { 
  40.             Intent intent1 = new Intent(); 
  41.             Operation operation = new Intent.OperationBuilder() 
  42.                     .withAction("action.inflate.slice"
  43.                     .build(); 
  44.             intent1.setOperation(operation); 
  45.             startAbilityForResult(intent1, 1); 
  46.         }); 
  47.  
  48.     } 
  49.  
  50.     @Override 
  51.     public void onActive() { 
  52.         super.onActive(); 
  53.     } 
  54.  
  55.     @Override 
  56.     public void onForeground(Intent intent) { 
  57.         super.onForeground(intent); 
  58.     } 
  59.  
  60.  
【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章