Liên kết Kiểu với giao diện Compose

Liên kết từ các Kiểu trong Figma đến giao diện trong Compose

Figma cho phép nhà thiết kế áp dụng kiểu cho thành phần thiết kế. Kiểu là tập hợp các thuộc tính có thể sử dụng lại, chẳng hạn như màu sắc hoặc kiểu chữ. Vì kiểu được xác định tập trung, nên nhóm thiết kế có thể xác định và cập nhật các thuộc tính trên tất cả thiết kế khi cập nhật một thành phần thiết kế riêng lẻ. Bạn có thể thiết lập tính năng Chuyển tiếp để dịch kiểu Figma sang giao diện của Jetpack Compose.

Ánh xạ giữa kiểu Figma và giao diện Compose được chỉ định thông qua tệp cấu hình.

Tệp cấu hình liên kết các kiểu Figma và giao diện Compose

Ví dụ: thiết kế Figma dưới đây sử dụng kiểu trong Bộ thiết kế Material 3 của Google. Đối với văn bản Chính – Tiêu đề lớn, phông chữ là M3/title/large và màu sắc là M3/sys/light/primary.

Kiểu Material 3 trong Figma

Nếu chúng ta nhập thiết kế đã bật tính năng dịch kiểu Bộ thiết kế M3, thì mã sau đây sẽ được tạo cho văn bản Chính – Tiêu đề lớn:

@Composable
fun PrimaryTitleLarge(modifier: Modifier = Modifier) {
    Text(
        content = "Primary - Title large",
        fontSize = MaterialTheme.typography.titleLarge.fontSize,
        fontFamily = MaterialTheme.typography.titleLarge.fontFamily,
        color = MaterialTheme.colorScheme.primary,
        height = MaterialTheme.typography.titleLarge.lineHeight,
        letterSpacing = MaterialTheme.typography.titleLarge.letterSpacing,
        textAlign = TextAlign.Left,
        fontWeight = MaterialTheme.typography.titleLarge.fontWeight,
        modifier = modifier
    )
}

Để sử dụng tính năng này, hãy sử dụng các kiểu mà bạn thường dùng trong Figma. Sau đó, trong Android Studio, hãy chuyển đến File > New > Import UI Packages… (Tệp > Mới > Nhập gói giao diện người dùng…), rồi đánh dấu chọn Translate Figma styles to Compose theme (Dịch kiểu Figma sang giao diện Compose).

Tại bước này, bạn phải chọn cấu hình để dịch các kiểu thiết kế:

  • Nếu chúng trực tiếp đến từ Bộ công cụ thiết kế Material 3 của Google cho Figma (có định dạng M3/body/medium or M3/sys/light/primary), hãy chọn cấu hình Bộ thiết kế Material 3.
  • Nếu chúng trực tiếp đến từ Bộ công cụ thiết kế Material 2 của Google cho Figma (có định dạng 01. Primary/500 or Subtitle 1), hãy chọn cấu hình Bộ thiết kế Material 2.
  • Nếu bạn có các định nghĩa kiểu của riêng mình, hãy chọn tuỳ chọn Cấu hình tuỳ chỉnh rồi chọn tệp chứa ánh xạ giữa kiểu Figma và giao diện Compose (như mô tả trong phần này).

    Hộp thoại Import UI Package (Nhập Gói giao diện người dùng)

Nếu có kiểu trong thiết kế Figma không có trong cấu hình đã chọn, hộp thoại Nhập sẽ hiển thị cảnh báo đối với từng kiểu chưa được liên kết. Mỗi kiểu chưa được liên kết sẽ được dịch thành giá trị cố định. Ban đầu thì cảnh báo được thu gọn; hãy nhấp vào biểu ngữ cảnh báo để mở rộng. Mỗi cảnh báo có một đường liên kết đến lớp cụ thể trong tệp Figma là nguyên nhân của cảnh báo.

Cảnh báo trong hộp thoại Nhập

Sau khi nhập, cấu hình kiểu sẽ nằm trong dự án Android Studio. Hãy tìm các mã này trong thư mục ui-package-resources/style-mappings.

Tệp cấu hình cho bản dịch tuỳ chỉnh

Quá trình dịch kiểu Figma sang giao diện Compose gồm hai bước:

  1. Kiểu Figma trong Gói giao diện người dùng được dịch sang mã thông báo thiết kế trong tệp JSON định nghĩa Gói giao diện người dùng. Tệp này nằm ở thư mục Gói giao diện người dùng trong dự án Android Studio.
  2. Mã thông báo thiết kế trong tệp định nghĩa Gói giao diện người dùng sẽ được dịch sang một đoạn mã của giao diện Compose trong dự án Android Studio.

Định dạng của tệp cấu hình tuỳ chỉnh (ở định dạng JSON) phản ánh hai bước này. Dưới đây là ví dụ về một tệp cấu hình tuỳ chỉnh đơn giản chỉ xử lý các màu:

{
  "figma": {
    "colors": {
      "my-app-theme/sys/light/primary": "myapp.sys.color.primary",
      "my-app-theme/sys/light/primary-container": "myapp.sys.color.primary-container",
      "my-app-theme/sys/light/background": "myapp.sys.color.background",
      "my-app-theme/sys/light/on-background": "myapp.sys.color.on-background",
      "my-app-theme/sys/dark/background": "myapp.sys.color.background",
      "my-app-theme/sys/dark/on-background": "myapp.sys.color.on-background"
    }
  },
  "compose": {
    "colors": {
      "myapp.sys.color.primary": "MaterialTheme.colorScheme.primary",
      "myapp.sys.color.primary-container": "MaterialTheme.colorScheme.primaryContainer",
      "myapp.sys.color.background": "MaterialTheme.colorScheme.background",
      "myapp.sys.color.on-background": "MaterialTheme.colorScheme.onBackground"
    },
    "options": {
      "packages": {
        "MaterialTheme": "androidx.compose.material3"
      }
    }
  }
}

Có hai phần cấp cao nhất, figma (chỉ định bước 1) và compose (chỉ định bước 2). Cả hai đều có phần colors:

  • Phần colors của figma chỉ định một kiểu Figma và mã thông báo thiết kế tương ứng sẽ được ghi vào tệp định nghĩa Gói giao diện người dùng.
  • Phần colors của compose chỉ định một mã thông báo thiết kế trong tệp định nghĩa Gói giao diện người dùng và đoạn mã tương ứng sẽ được ghi vào mã Compose.

Trong cấu hình ví dụ trên, mọi thành phần sử dụng màu my-app-theme/sys/light/primary trong Figma đều có màu được viết là myapp.sys.color.primary trong tệp định nghĩa Gói giao diện người dùng. Sau đó, trong quá trình tạo mã, màu đó được viết là MaterialTheme.colorScheme.primary trong Compose.

Phần compose cũng chứa phần options (cho biết gói có chứa một biểu tượng mã cụ thể). Ví dụ ở trên cho biết rằng MaterialTheme nằm trong gói androidx.compose.material3. Do đó, bạn nên nhập gói này vào mọi mã đã tạo.

Việc liên kết kiểu chữ phức tạp nhiều hơn một chút so với các kiểu màu. Sau đây là ví dụ ở trên, nhưng đã thêm các kiểu chữ kiểu chữ:

{
  "figma": {
    "colors": {
      "my-app-theme/sys/light/primary": "myapp.sys.color.primary",
      "my-app-theme/sys/light/primary-container": "myapp.sys.color.primary-container",
      "my-app-theme/sys/light/background": "myapp.sys.color.background",
      "my-app-theme/sys/light/on-background": "myapp.sys.color.on-background",
      "my-app-theme/sys/dark/background": "myapp.sys.color.background",
      "my-app-theme/sys/dark/on-background": "myapp.sys.color.on-background"
    },
    "typography": {
      "symbols": {
        "my-app-theme/headline/large": "myapp.sys.typescale.headline-large",
        "my-app-theme/body/medium": "myapp.sys.typescale.body-medium"
      },
      "subproperties": {
        "fontFamily": "font",
        "fontWeight": "weight",
        "fontSize": "size",
        "letterSpacing": "tracking",
        "lineHeightPx": "line-height"
      }
    }
  },
  "compose": {
    "colors": {
      "myapp.sys.color.primary": "MaterialTheme.colorScheme.primary",
      "myapp.sys.color.primary-container": "MaterialTheme.colorScheme.primaryContainer",
      "myapp.sys.color.background": "MaterialTheme.colorScheme.background",
      "myapp.sys.color.on-background": "MaterialTheme.colorScheme.onBackground"
    },
    "typography": {
      "symbols": {
        "myapp.sys.typescale.headline-large": "MaterialTheme.typography.headlineLarge",
        "myapp.sys.typescale.body-medium": "MaterialTheme.typography.bodyMedium"
      },
      "subproperties": {
        "font": "fontFamily",
        "weight": "fontWeight",
        "size": "fontSize",
        "tracking": "letterSpacing",
        "line-height": "lineHeight"
      }
    },
    "options": {
      "packages": {
        "MaterialTheme": "androidx.compose.material3"
      }
    }
  }
}

Cấu trúc của phần kiểu chữ phản ánh rằng kiểu chữ được tạo thành từ nhiều tài sản phụ. Trong Figma và Compose, kiểu chữ bao gồm tên, kiểu chữ, độ đậm, kích thước, khoảng cách chữ cái và chiều cao kiểu chữ, cùng nhiều yếu tố khác. Thay vì phải liên kết các tài sản phụ riêng lẻ của từng kiểu nhiều lần, chúng ta liên kết toàn bộ kiểu với mã thông báo và giao diện, sau đó liên kết riêng từng tài sản phụ.

Ví dụ trên cho biết khi một mục văn bản Figma mang kiểu my-app-theme/headline/large được ghi vào tệp định nghĩa gói giao diện người dùng, phông chữ của văn bản làmyapp.sys.typescale.headline-large.font, kích thước của văn bản này là myapp.sys.typescale.headline-large.size, v.v. Sau đó, khi mã Compose được tạo, một thành phần kết hợp RelayText (bao gồm thành phần kết hợp Text trong Compose Material) được tạo, trong đó tham số fontMaterialTheme.typography.headlineLarge.fontFamily, tham số sizeMaterialTheme.typography.headlineLarge.fontSize, v.v.

Để biết ví dụ về tệp cấu hình, bạn có thể xem cấu hình Bộ thiết kế Material 3 và Material 2 tích hợp sẵn. Các cấu hình này sử dụng chính xác định dạng. Bạn có thể tải các tệp xuống tại đây:

Các điểm hạn chế

Hiện tại, có một số trường hợp mà các kiểu không được dịch sang chủ đề:

  • Kiểu văn bản chỉ áp dụng cho một phần của thành phần văn bản (như mô tả trong phần Nhiều kiểu trong văn bản)
  • Bạn chỉ cần dịch một kiểu, nếu có nhiều kiểu áp dụng cho các biến thể khác nhau của một thành phần.