#flexbox #layout #facebook #bindings #engine #node #yoga-rs

yoga

Rust 对 Facebook 的 Yoga 的绑定,Yoga 是一个 Flexbox 布局引擎

6 个版本 (3 个重大变更)

0.4.0 2022年12月20日
0.3.1 2019年1月16日
0.3.0 2018年10月16日
0.2.0 2018年6月18日
0.1.1 2017年10月12日

#971 in GUI

Download history 19/week @ 2024-04-15 16/week @ 2024-04-22 32/week @ 2024-04-29 13/week @ 2024-05-06 69/week @ 2024-05-13 9/week @ 2024-05-20 61/week @ 2024-05-27 7/week @ 2024-06-03 1/week @ 2024-06-10 18/week @ 2024-06-17 103/week @ 2024-06-24 153/week @ 2024-07-01 10/week @ 2024-07-08 113/week @ 2024-07-15 9/week @ 2024-07-22 74/week @ 2024-07-29

每月下载量 285 次

MIT 许可证

7MB
135K SLoC

C++ 61K SLoC // 0.2% comments JavaScript 21K SLoC // 0.0% comments C# 19K SLoC // 0.0% comments Java 19K SLoC // 0.0% comments Python 7.5K SLoC // 0.3% comments Visual Studio Project 3K SLoC Rust 1.5K SLoC // 0.0% comments Objective-C 1K SLoC // 0.0% comments Visual Studio Solution 1K SLoC Automake 385 SLoC // 0.2% comments Swift 295 SLoC // 0.1% comments M4 255 SLoC // 0.4% comments Shell 149 SLoC // 0.4% comments C 143 SLoC // 0.0% comments Ruby 87 SLoC // 0.1% comments Batch 71 SLoC Xcode Config 33 SLoC // 0.7% comments Prolog 15 SLoC NuGet Config 8 SLoC

包含 (JAR 文件, 1.5MB) android-support-v4.jar, (Zip 文件, 1MB) appcompat-v7-24.2.1.aar, (JAR 文件, 315KB) src/yoga/lib/junit/junit-4.12.jar, (JAR 文件, 125KB) src/yoga/lib/hamcrest/hamcrest-2.1.jar, (JAR 文件, 55KB) gradle-wrapper.jar, (Zip 文件, 59KB) src/yoga/lib/soloader/soloader-0.5.1.aar 和更多.

Yoga-rs

Build Status

Facebook 的 Yoga 布局库的 Rust 包装器。

您还可以查看 taffy(已废弃的 stretch 的复活分支),因为它是一个纯 Rust 实现。

依赖项

  • cargo
  • rustc

构建

$ cargo build --release

运行示例

$ cargo run --release --example layout

格式化代码

$ cargo +nightly fmt

示例代码

#[macro_use]
extern crate yoga;

use yoga::prelude::*;
use yoga::Node;
use yoga::StyleUnit::{Auto, UndefinedValue};

fn main() {
	let mut node = Node::new();

	let mut child = Node::new();
	let mut other_child = Node::new();

	node.insert_child(&mut child, 0);
	node.insert_child(&mut other_child, 1);

	style!(node,
		Margin(10 pt),
		MarginLeft(Auto),
		PaddingHorizontal(4 pt),
		Left(16 %),
		Bottom(UndefinedValue)
	);

	let child_styles = make_styles!(
		Width(32 pt),
		Height(32 pt),
		FlexGrow(1.0),
		Margin(Auto)
	);

	child.apply_styles(&child_styles);
	other_child.apply_styles(&child_styles);

	node.calculate_layout(512.0, 512.0, yoga::Direction::LTR);

	println!("Layout is {:#?}", child.get_layout());
}

测试

单元测试是基于上游 fixture 自动生成的,不应手动编辑。

$ cargo test

要生成测试用例:下载 ChromeDriver 可执行文件并将其放在您的 $PATH 中的某个位置。Linux/MacOS 示例

$ cp chromedriver /usr/local/bin

然后运行以下命令

$ cd gentest
$ bundle install # Install the required ruby gems
$ ruby gentest/gentest.rb # Generate the tests
$ cargo +nightly fmt # Format the tests for consistency

依赖项