Các hạn chế và thứ tự của đối tượng sửa đổi

Trong Compose, bạn có thể liên kết nhiều đối tượng sửa đổi với nhau để thay đổi giao diện của một thành phần kết hợp. Các chuỗi đối tượng sửa đổi này có thể ảnh hưởng đến các quy tắc ràng buộc được truyền đến các thành phần kết hợp, giúp xác định giới hạn chiều rộng và chiều cao.

Trang này mô tả cách các đối tượng sửa đổi theo chuỗi ảnh hưởng đến các điều kiện ràng buộc, đồng thời đo lường và đặt các thành phần kết hợp.

Đối tượng sửa đổi trong cây giao diện người dùng

Để hiểu cách các đối tượng sửa đổi ảnh hưởng lẫn nhau, bạn nên trực quan hoá cách các đối tượng sửa đổi xuất hiện trong cây giao diện người dùng được tạo trong giai đoạn thành phần. Để biết thêm thông tin, hãy xem mục Bản sáng tác.

Trong cây giao diện người dùng, bạn có thể trực quan hoá các đối tượng sửa đổi dưới dạng nút trình bao bọc cho các nút bố cục:

Mã cho các thành phần kết hợp và đối tượng sửa đổi cũng như cách trình bày trực quan của các thành phần này dưới dạng cây giao diện người dùng.
Hình 1. Đối tượng sửa đổi gói các nút bố cục trong cây giao diện người dùng.

Việc thêm nhiều đối tượng sửa đổi vào một thành phần kết hợp sẽ tạo ra một chuỗi đối tượng sửa đổi. Khi bạn liên kết nhiều đối tượng sửa đổi, mỗi nút đối tượng sửa đổi sẽ gói phần còn lại của chuỗi và nút bố cục bên trong. Ví dụ: khi bạn liên kết một đối tượng sửa đổi clipsize, nút đối tượng sửa đổi clip sẽ gói nút đối tượng sửa đổi size, sau đó sẽ gói nút bố cục Image.

Trong giai đoạn bố cục, thuật toán di chuyển trên cây vẫn giữ nguyên, nhưng mỗi nút của đối tượng sửa đổi cũng được truy cập. Bằng cách này, đối tượng sửa đổi có thể thay đổi các yêu cầu về kích thước và vị trí của đối tượng sửa đổi hoặc nút bố cục mà đối tượng sửa đổi gói đó.

Như trong Hình 2, quá trình triển khai bản thân các thành phần kết hợp ImageText sẽ bao gồm một chuỗi đối tượng sửa đổi gói một nút bố cục duy nhất. Việc triển khai RowColumn chỉ đơn giản là các nút bố cục mô tả cách bố trí bố cục thành phần con.

Cấu trúc cây trước đây, nhưng hiện tại mỗi nút chỉ là một bố cục đơn giản, với nhiều nút đối tượng sửa đổi bao quanh nó.
Hình 2. Cấu trúc cây tương tự như trong Hình 1, nhưng với các thành phần kết hợp trong cây giao diện người dùng được hiển thị dưới dạng chuỗi đối tượng sửa đổi.

Tóm tắt:

  • Đối tượng sửa đổi gói một đối tượng sửa đổi hoặc nút bố cục.
  • Nút bố cục có thể bố trí nhiều nút con.

Các phần sau đây mô tả cách sử dụng mô hình tư duy này để giải thích về việc tạo chuỗi đối tượng sửa đổi và cách chuỗi này ảnh hưởng đến kích thước của các thành phần kết hợp.

Các hạn chế trong giai đoạn bố cục

Giai đoạn bố cục tuân theo thuật toán 3 bước để tìm chiều rộng, chiều cao và toạ độ x, y của từng nút bố cục:

  1. Đo lường các phần tử con: Một nút đo lường các phần tử con, nếu có.
  2. Quyết định kích thước riêng: Dựa trên các phép đo đó, một nút sẽ quyết định kích thước riêng của mình.
  3. Đặt vị trí con: Mỗi nút con được đặt tương ứng với một vị trí riêng của một nút.

Constraints giúp tìm kích thước phù hợp cho các nút trong 2 bước đầu tiên của thuật toán. Các quy tắc ràng buộc xác định giới hạn tối thiểu và tối đa cho chiều rộng và chiều cao của một nút. Khi nút quyết định kích thước của nó, kích thước đo được của nút phải nằm trong phạm vi kích thước này.

Các loại quy tắc ràng buộc

Quy tắc ràng buộc có thể là một trong những quy tắc sau:

  • Có giới hạn: Nút có chiều rộng và chiều cao tối đa và tối thiểu.
Các hạn chế ràng buộc có kích thước khác nhau trong một vùng chứa.
Hình 3. Quy tắc ràng buộc bị ràng buộc.
  • Không bị ràng buộc: Nút không bị ràng buộc vào bất kỳ kích thước nào. Giới hạn chiều rộng và chiều cao tối đa được đặt thành vô cực.
Các điều kiện ràng buộc không giới hạn có chiều rộng và chiều cao được đặt thành vô cùng. Các quy tắc ràng buộc mở rộng ra ngoài vùng chứa.
Hình 4. Các quy tắc ràng buộc không bị ràng buộc.
  • Chính xác: Nút phải tuân theo một yêu cầu về kích thước chính xác. Giới hạn tối thiểu và tối đa được đặt thành cùng một giá trị.
Các quy tắc ràng buộc chính xác tuân theo yêu cầu về kích thước chính xác trong vùng chứa.
Hình 5. Các quy tắc ràng buộc chính xác.
  • Kết hợp: Nút này tuân theo sự kết hợp của các loại quy tắc ràng buộc ở trên. Ví dụ: một điều kiện ràng buộc có thể ràng buộc chiều rộng trong khi cho phép chiều cao tối đa không giới hạn, hoặc đặt chiều rộng chính xác nhưng đưa ra chiều cao giới hạn.
Hai vùng chứa thể hiện sự kết hợp giữa điều kiện ràng buộc bị ràng buộc và không giới hạn cũng như chiều rộng và chiều cao chính xác.
Hình 6. Sự kết hợp giữa điều kiện ràng buộc giới hạn và không giới hạn cũng như chiều rộng và chiều cao chính xác.

Phần tiếp theo mô tả cách truyền những điều kiện ràng buộc này từ mẹ sang con.

Cách truyền các quy tắc ràng buộc từ phần tử mẹ sang phần tử con

Trong bước đầu tiên của thuật toán như mô tả trong phần Các quy tắc ràng buộc trong giai đoạn bố cục, các quy tắc ràng buộc sẽ được truyền từ phần tử mẹ xuống phần tử con trong cây giao diện người dùng.

Khi một nút mẹ đo lường các phần tử con, nút này sẽ cung cấp các quy tắc ràng buộc này cho từng phần tử con để cho chúng biết kích thước được phép hay nhỏ. Sau đó, khi quyết định kích thước của mình, ứng dụng cũng tuân thủ những ràng buộc mà phần tử mẹ của chính mình truyền vào.

Ở cấp độ cao, thuật toán hoạt động theo cách sau:

  1. Để quyết định kích thước mà nút thực sự muốn chiếm, nút gốc trong cây giao diện người dùng sẽ đo lường các phần tử con và chuyển tiếp các quy tắc ràng buộc tương tự đến nút con đầu tiên của nó.
  2. Nếu thành phần con là một đối tượng sửa đổi không ảnh hưởng đến hoạt động đo lường, thì thành phần con sẽ chuyển tiếp các quy tắc ràng buộc đến đối tượng sửa đổi tiếp theo. Các điều kiện ràng buộc được truyền xuống chuỗi đối tượng sửa đổi nguyên trạng, trừ phi đạt được một đối tượng sửa đổi tác động đến việc đo lường. Sau đó, các điều kiện ràng buộc sẽ được đổi kích thước tương ứng.
  3. Sau khi đạt đến một nút không có nút con nào (gọi là "nút lá"), nút đó sẽ quyết định kích thước dựa trên các điều kiện ràng buộc đã truyền vào và trả về kích thước đã phân giải này về kích thước đã phân giải này.
  4. Thành phần mẹ sẽ điều chỉnh các quy tắc ràng buộc dựa trên kết quả đo lường của thành phần con này, đồng thời gọi thành phần con tiếp theo với các quy tắc ràng buộc đã được điều chỉnh này.
  5. Sau khi tất cả các phần tử con của nút mẹ được đo lường, nút mẹ sẽ quyết định kích thước riêng và thông báo điều đó cho nút mẹ.
  6. Bằng cách này, toàn bộ cây được di chuyển theo chiều sâu. Cuối cùng, tất cả các nút đã quyết định về kích thước của chúng và bước đo lường đã hoàn tất.

Để biết ví dụ chuyên sâu, hãy xem video về Các quy tắc ràng buộc và thứ tự của đối tượng sửa đổi.

Đối tượng sửa đổi ảnh hưởng đến các quy tắc ràng buộc

Trong phần trước, bạn đã tìm hiểu rằng một số đối tượng sửa đổi có thể ảnh hưởng đến kích thước quy tắc ràng buộc. Các phần sau đây mô tả các đối tượng sửa đổi cụ thể tác động đến các quy tắc ràng buộc.

Đối tượng sửa đổi size

Đối tượng sửa đổi size khai báo kích thước ưu tiên của nội dung.

Ví dụ: cây giao diện người dùng sau đây sẽ được hiển thị trong vùng chứa 300dp của 200dp. Các điều kiện ràng buộc được ràng buộc, cho phép chiều rộng từ 100dp đến 300dp và chiều cao từ 100dp đến 200dp:

Một phần của cây giao diện người dùng có đối tượng sửa đổi kích thước gói một nút bố cục và nội dung biểu thị các điều kiện ràng buộc bị ràng buộc do đối tượng sửa đổi kích thước đặt trong một vùng chứa.
Hình 7. Các điều kiện ràng buộc bị ràng buộc trong cây giao diện người dùng và cách biểu thị của nó trong một vùng chứa.

Đối tượng sửa đổi size điều chỉnh các điều kiện ràng buộc đến cho phù hợp với giá trị được truyền vào. Trong ví dụ này, giá trị là 150dp:

Giống như Hình 7, ngoại trừ việc đối tượng sửa đổi kích thước điều chỉnh các điều kiện ràng buộc đến cho phù hợp với giá trị được truyền vào.
Hình 8. Đối tượng sửa đổi size điều chỉnh các điều kiện ràng buộc thành 150dp.

Nếu chiều rộng và chiều cao nhỏ hơn giới hạn ràng buộc nhỏ nhất hoặc lớn hơn giới hạn ràng buộc lớn nhất, thì đối tượng sửa đổi sẽ khớp với các quy tắc ràng buộc đã truyền sát sao nhất có thể trong khi vẫn tuân thủ các quy tắc ràng buộc được truyền vào:

Hai cây giao diện người dùng và các cách biểu diễn tương ứng trong vùng chứa. Trong phần đầu tiên, đối tượng sửa đổi kích thước chấp nhận các quy tắc ràng buộc tăng cường; trong lần thứ hai, đối tượng sửa đổi kích thước sẽ điều chỉnh cho phù hợp với các quy tắc ràng buộc quá lớn nhất có thể, dẫn đến các quy tắc hạn chế lấp đầy vùng chứa.
Hình 9. Đối tượng sửa đổi size tuân thủ quy tắc ràng buộc đã truyền ở mức chặt chẽ nhất có thể.

Xin lưu ý rằng việc liên kết nhiều đối tượng sửa đổi size không hoạt động. Đối tượng sửa đổi size đầu tiên đặt cả giới hạn tối thiểu và tối đa thành một giá trị cố định. Ngay cả khi đối tượng sửa đổi kích thước thứ hai yêu cầu kích thước nhỏ hơn hoặc lớn hơn, công cụ này vẫn cần tuân thủ các giới hạn chính xác được truyền vào để không ghi đè các giá trị đó:

Một chuỗi gồm hai đối tượng sửa đổi kích thước trong cây giao diện người dùng và cách biểu diễn trong một vùng chứa, là kết quả của giá trị đầu tiên được truyền vào chứ không phải của giá trị thứ hai.
Hình 10. Một chuỗi gồm hai đối tượng sửa đổi size, trong đó giá trị thứ hai được truyền vào (50dp) không ghi đè giá trị đầu tiên (100dp).

Đối tượng sửa đổi requiredSize

Sử dụng đối tượng sửa đổi requiredSize thay vì size nếu bạn cần nút ghi đè các điều kiện ràng buộc sắp tới. Đối tượng sửa đổi requiredSize thay thế các điều kiện ràng buộc sắp tới và chuyển kích thước mà bạn chỉ định dưới dạng giới hạn chính xác.

Khi kích thước được chuyển trở lại cây, nút con sẽ được căn giữa trong không gian hiện có:

Kích thước và đối tượng sửa đổi requiredSize được liên kết trong cây giao diện người dùng và nội dung biểu diễn tương ứng trong vùng chứa. Các điều kiện ràng buộc của đối tượng sửa đổi requiredSize sẽ ghi đè các giới hạn của đối tượng sửa đổi kích thước.
Hình 11. Đối tượng sửa đổi requiredSize ghi đè các điều kiện ràng buộc đến từ đối tượng sửa đổi size.

Đối tượng sửa đổi widthheight

Đối tượng sửa đổi size điều chỉnh cả chiều rộng và chiều cao của các điều kiện ràng buộc. Với đối tượng sửa đổi width, bạn có thể đặt chiều rộng cố định nhưng chưa quyết định chiều cao. Tương tự, với đối tượng sửa đổi height, bạn có thể đặt chiều cao cố định, nhưng chưa quyết định chiều rộng:

Hai cây giao diện người dùng, một cây có đối tượng sửa đổi chiều rộng và cách biểu diễn vùng chứa, còn cây còn lại có đối tượng sửa đổi chiều cao và đối tượng đại diện.
Hình 12. Đối tượng sửa đổi width và đối tượng sửa đổi height đặt chiều rộng và chiều cao cố định tương ứng.

Đối tượng sửa đổi sizeIn

Đối tượng sửa đổi sizeIn cho phép bạn đặt các điều kiện ràng buộc tối thiểu và tối đa chính xác cho chiều rộng và chiều cao. Sử dụng đối tượng sửa đổi sizeIn nếu bạn cần kiểm soát chi tiết các quy tắc ràng buộc.

Cây giao diện người dùng có đối tượng sửa đổi kích thước với chiều rộng và chiều cao tối thiểu và tối đa được thiết lập, đồng thời biểu thị giá trị này trong một vùng chứa.
Hình 13. Đối tượng sửa đổi sizeIn với minWidth, maxWidth, minHeightmaxHeight được thiết lập.

Ví dụ

Phần này cho thấy và giải thích kết quả từ một số đoạn mã bằng đối tượng sửa đổi theo chuỗi.

Image(
    painterResource(R.drawable.hero),
    contentDescription = null,
    Modifier
        .fillMaxSize()
        .size(50.dp)
)

Đoạn mã này cho ra kết quả sau:

  • Đối tượng sửa đổi fillMaxSize thay đổi các điều kiện ràng buộc để đặt cả chiều rộng và chiều cao tối thiểu thành giá trị tối đa – chiều rộng 300dp và chiều cao 200dp.
  • Mặc dù đối tượng sửa đổi size muốn sử dụng kích thước 50dp, nhưng nó vẫn cần phải tuân thủ các quy tắc ràng buộc tối thiểu sắp tới. Vì vậy, đối tượng sửa đổi size cũng sẽ xuất ra các giới hạn ràng buộc chính xác của 300 theo 200, bỏ qua giá trị được cung cấp trong đối tượng sửa đổi size một cách hiệu quả.
  • Image tuân theo các giới hạn này và báo cáo kích thước 300 bằng 200, kích thước này được truyền lên đến tận cây.

Image(
    painterResource(R.drawable.hero),
    contentDescription = null,
    Modifier
        .fillMaxSize()
        .wrapContentSize()
        .size(50.dp)
)

Đoạn mã này cho ra kết quả sau:

  • Đối tượng sửa đổi fillMaxSize điều chỉnh các quy tắc ràng buộc để đặt cả chiều rộng và chiều cao tối thiểu thành giá trị tối đa – 300dp chiều rộng và 200dp về chiều cao.
  • Đối tượng sửa đổi wrapContentSize đặt lại các điều kiện ràng buộc tối thiểu. Vì vậy, mặc dù fillMaxSize dẫn đến các quy tắc ràng buộc cố định, nhưng wrapContentSize đặt lại phương thức đó về các quy tắc ràng buộc bị ràng buộc. Nút sau đây hiện có thể chiếm toàn bộ không gian hoặc nhỏ hơn toàn bộ không gian.
  • Đối tượng sửa đổi size đặt các quy tắc ràng buộc thành giới hạn tối thiểu và tối đa của 50.
  • Image phân giải thành kích thước 50 theo 50 và đối tượng sửa đổi size sẽ chuyển tiếp kích thước đó.
  • Đối tượng sửa đổi wrapContentSize có một thuộc tính đặc biệt. Phương thức này lấy phần tử con và đặt vào giữa các giới hạn tối thiểu có sẵn đã được truyền tới. Do đó, kích thước mà lớp này giao tiếp với phần tử mẹ bằng với giới hạn tối thiểu được truyền vào đó.

Bằng cách chỉ kết hợp 3 đối tượng sửa đổi, bạn có thể xác định kích thước cho thành phần kết hợp và căn giữa thành phần đó trong thành phần mẹ.

Image(
    painterResource(R.drawable.hero),
    contentDescription = null,
    Modifier
        .clip(CircleShape)
        .padding(10.dp)
        .size(100.dp)
)

Đoạn mã này cho ra kết quả sau:

  • Đối tượng sửa đổi clip không thay đổi các quy tắc ràng buộc.
    • Đối tượng sửa đổi padding hạ thấp các giới hạn tối đa.
    • Đối tượng sửa đổi size đặt mọi điều kiện ràng buộc thành 100dp.
    • Image tuân thủ các quy tắc ràng buộc đó và báo cáo kích thước 100 bằng 100dp.
    • Đối tượng sửa đổi padding thêm 10dp trên mọi kích thước, do đó, tăng chiều rộng và chiều cao được báo cáo thêm 20dp.
    • Hiện đang trong giai đoạn vẽ, đối tượng sửa đổi clip hoạt động trên canvas 120 của 120dp. Do đó, Google sẽ tạo một mặt nạ hình tròn có kích thước đó.
    • Sau đó, đối tượng sửa đổi padding sẽ lồng nội dung của nó với 10dp trên tất cả các kích thước để giảm kích thước canvas xuống 100 x 100dp.
    • Image sẽ được vẽ trong canvas đó. Hình ảnh được cắt dựa trên vòng tròn ban đầu của 120dp, vì vậy, kết quả đầu ra không phải là kết quả tròn.