Tạo một ảnh động chuyển tiếp tuỳ chỉnh

Hiệu ứng chuyển đổi tuỳ chỉnh cho phép bạn tạo ảnh động chưa có sẵn từ bất kỳ các lớp chuyển đổi tích hợp sẵn. Ví dụ: bạn có thể xác định hiệu ứng chuyển đổi tuỳ chỉnh màu nền trước của văn bản và các trường nhập dữ liệu sang màu xám để cho biết các trường này đã bị tắt trong màn hình mới. Loại thay đổi này giúp người dùng thấy các trường bạn đã vô hiệu hoá.

Hiệu ứng chuyển đổi tuỳ chỉnh, chẳng hạn như một trong các loại hiệu ứng chuyển đổi tích hợp sẵn, sẽ áp dụng ảnh động cho khung hiển thị con của cả cảnh bắt đầu và cảnh kết thúc. Tuy nhiên, không giống như các loại chuyển đổi tích hợp sẵn, bạn phải cung cấp mã để ghi lại giá trị thuộc tính và tạo ảnh động. Bạn cũng có thể xác định một tập hợp con các thành phần hiển thị mục tiêu cho ảnh động.

Trang này hướng dẫn bạn cách thu thập giá trị thuộc tính và tạo ảnh động để tạo hiệu ứng chuyển cảnh tuỳ chỉnh.

Mở rộng lớp Transition

Để tạo một hiệu ứng chuyển đổi tuỳ chỉnh, hãy thêm một lớp vào dự án giúp mở rộng lớp Transition và ghi đè các hàm hiển thị trong đoạn mã sau:

Kotlin

class CustomTransition : Transition() {

    override fun captureStartValues(transitionValues: TransitionValues) {}

    override fun captureEndValues(transitionValues: TransitionValues) {}

    override fun createAnimator(
        sceneRoot: ViewGroup,
        startValues: TransitionValues?,
        endValues: TransitionValues?
    ): Animator? {}

}

Java

public class CustomTransition extends Transition {

    @Override
    public void captureStartValues(TransitionValues values) {}

    @Override
    public void captureEndValues(TransitionValues values) {}

    @Override
    public Animator createAnimator(ViewGroup sceneRoot,
                                   TransitionValues startValues,
                                   TransitionValues endValues) {}
}

Các phần sau đây giải thích cách ghi đè các hàm này.

Ghi lại giá trị thuộc tính chế độ xem

Ảnh động chuyển tiếp sử dụng hệ thống ảnh động thuộc tính được mô tả trong Tổng quan về ảnh động thuộc tính. Tài sản ảnh động thay đổi thuộc tính chế độ xem từ giá trị bắt đầu thành giá trị kết thúc trong giá trị được chỉ định do đó, khung cần có cả giá trị bắt đầu và giá trị kết thúc là thuộc tính để tạo ảnh động.

Tuy nhiên, ảnh động thuộc tính thường chỉ cần một tập hợp con nhỏ của tất cả thuộc tính của chế độ xem giá trị. Ví dụ: ảnh động màu cần giá trị thuộc tính màu, trong khi chuyển động ảnh động cần giá trị thuộc tính vị trí. Vì giá trị thuộc tính cần thiết cho ảnh động dành riêng cho một quá trình chuyển đổi, khung chuyển đổi không cung cấp mọi giá trị thuộc tính chuyển đổi. Thay vào đó, khung sẽ gọi các hàm callback cho phép chuyển đổi đến chỉ thu thập các giá trị thuộc tính cần thiết rồi lưu trữ các giá trị đó trong khung.

Thu thập giá trị bắt đầu

Để chuyển các giá trị của khung hiển thị ban đầu vào khung, hãy triển khai phương thức captureStartValues(transitionValues) . Khung này gọi hàm này cho mọi thành phần hiển thị trong cảnh bắt đầu. Hàm đối số là một đối tượng TransitionValues có chứa tham chiếu vào thành phần hiển thị và thực thể Map, trong đó bạn có thể lưu trữ các giá trị của thành phần hiển thị mà bạn muốn. Trong quá trình triển khai, hãy truy xuất các giá trị thuộc tính này và chuyển lại cho bằng cách lưu trữ chúng trong bản đồ.

Để đảm bảo rằng khoá cho một giá trị thuộc tính không xung đột với khoá khác TransitionValues khoá, hãy dùng lược đồ đặt tên sau:

package_name:transition_name:property_name

Đoạn mã sau đây cho thấy cách triển khai hàm captureStartValues():

Kotlin

class CustomTransition : Transition() {

    // Define a key for storing a property value in
    // TransitionValues.values with the syntax
    // package_name:transition_class:property_name to avoid collisions
    private val PROPNAME_BACKGROUND = "com.example.android.customtransition:CustomTransition:background"

    override fun captureStartValues(transitionValues: TransitionValues) {
        // Call the convenience method captureValues
        captureValues(transitionValues)
    }

    // For the view in transitionValues.view, get the values you
    // want and put them in transitionValues.values
    private fun captureValues(transitionValues: TransitionValues) {
        // Get a reference to the view
        val view = transitionValues.view
        // Store its background property in the values map
        transitionValues.values[PROPNAME_BACKGROUND] = view.background
    }

    ...

}

Java

public class CustomTransition extends Transition {

    // Define a key for storing a property value in
    // TransitionValues.values with the syntax
    // package_name:transition_class:property_name to avoid collisions
    private static final String PROPNAME_BACKGROUND =
            "com.example.android.customtransition:CustomTransition:background";

    @Override
    public void captureStartValues(TransitionValues transitionValues) {
        // Call the convenience method captureValues
        captureValues(transitionValues);
    }


    // For the view in transitionValues.view, get the values you
    // want and put them in transitionValues.values
    private void captureValues(TransitionValues transitionValues) {
        // Get a reference to the view
        View view = transitionValues.view;
        // Store its background property in the values map
        transitionValues.values.put(PROPNAME_BACKGROUND, view.getBackground());
    }
    ...
}

Lấy giá trị kết thúc

Khung này sẽ gọi hàm captureEndValues(TransitionValues) một lần cho mỗi khung hiển thị mục tiêu trong cảnh kết thúc. Trong mọi khía cạnh khác, captureEndValues() hoạt động giống như captureStartValues().

Đoạn mã sau đây cho thấy cách triển khai hàm captureEndValues():

Kotlin

override fun captureEndValues(transitionValues: TransitionValues) {
    captureValues(transitionValues)
}

Java

@Override
public void captureEndValues(TransitionValues transitionValues) {
    captureValues(transitionValues);
}

Trong ví dụ này, cả captureStartValues()captureEndValues() các hàm gọi captureValues() để truy xuất và lưu trữ các giá trị. Thuộc tính khung hiển thị mà captureValues() truy xuất giống nhau, nhưng có các giá trị khác nhau trong phần tử cảnh bắt đầu và cảnh kết thúc. Khung này duy trì các bản đồ riêng biệt cho điểm xuất phát và điểm kết thúc của một khung hiển thị.

Tạo một ảnh động tuỳ chỉnh

Để tạo ảnh động cho các thay đổi đối với thành phần hiển thị giữa trạng thái của cảnh bắt đầu và trạng thái của thành phần hiển thị đó trong cảnh kết thúc, cung cấp ảnh động bằng cách ghi đè createAnimator() . Khi gọi hàm này, khung sẽ chuyển vào chế độ xem gốc của cảnh và Đối tượng TransitionValues chứa giá trị bắt đầu và giá trị kết thúc mà bạn đã chụp.

Số lần khung gọi hàm createAnimator() tuỳ thuộc vào những thay đổi xảy ra giữa cảnh bắt đầu và cảnh kết thúc.

Ví dụ: cân nhắc việc làm mờ hoặc ảnh động mờ dần được triển khai dưới dạng hiệu ứng chuyển đổi tuỳ chỉnh. Nếu cảnh bắt đầu có 5 mục tiêu, là hai cảnh được xóa khỏi cảnh kết thúc và cảnh kết thúc có ba mục tiêu từ khi bắt đầu cảnh cùng với một mục tiêu mới, sau đó khung sẽ gọi createAnimator() 6 lần. Ba lệnh gọi tạo hiệu ứng động mờ dần và rõ dần của các mục tiêu ở trong cả hai cảnh . Hai lệnh gọi khác tạo hiệu ứng động cho việc làm mờ các mục tiêu bị xoá khỏi cảnh kết thúc. Một lệnh gọi tạo hoạt ảnh mờ dần của mục tiêu mới trong cảnh kết thúc.

Đối với khung hiển thị mục tiêu tồn tại trong cả cảnh bắt đầu và cảnh kết thúc, khung này sẽ cung cấp đối tượng TransitionValues cho cả startValuesendValues đối số. Đối với các chế độ xem mục tiêu chỉ tồn tại trong phần đầu hoặc cảnh kết thúc, khung này sẽ cung cấp một đối tượng TransitionValues cho đối số tương ứng và null cho đối số còn lại.

Để triển khai hàm createAnimator(ViewGroup, TransitionValues, TransitionValues) khi bạn tạo hiệu ứng chuyển đổi tuỳ chỉnh, hãy sử dụng các giá trị thuộc tính khung hiển thị mà bạn đã chụp được để tạo một đối tượng Animator và trả về đối tượng đó cho khung. Ví dụ về cách triển khai, hãy xem lớp ChangeColor trong Mẫu CustomTransition. Để biết thêm thông tin về ảnh động tài sản, hãy xem Ảnh động thuộc tính.

Áp dụng hiệu ứng chuyển đổi tuỳ chỉnh

Hiệu ứng chuyển đổi tuỳ chỉnh hoạt động giống như hiệu ứng chuyển đổi tích hợp sẵn. Bạn có thể áp dụng hiệu ứng chuyển đổi tuỳ chỉnh bằng trình quản lý chuyển đổi, như mô tả trong Áp dụng hiệu ứng chuyển đổi.