Ảnh động dựa trên cử chỉ hất sử dụng lực ma sát tỷ lệ thuận với tốc độ của đối tượng. Sử dụng thuộc tính này để tạo ảnh động cho một thuộc tính của đối tượng và để kết thúc ảnh động một cách từ từ. Nó có động lượng ban đầu nhận được chủ yếu qua tốc độ cử chỉ rồi dần chậm lại. Ảnh động sẽ kết thúc khi tốc độ của ảnh động đủ thấp để không tạo ra sự thay đổi rõ ràng trên màn hình thiết bị.
Để tìm hiểu về các chủ đề có liên quan, hãy đọc các hướng dẫn sau:
Thêm thư viện AndroidX
Để sử dụng ảnh động dựa trên vật lý, bạn phải thêm thư viện AndroidX vào dự án như sau:
- Mở tệp
build.gradle
cho mô-đun ứng dụng. - Thêm thư viện AndroidX vào phần
dependencies
.Groovy
dependencies { implementation 'androidx.dynamicanimation:dynamicanimation:1.0.0' }
Kotlin
dependencies { implementation("androidx.dynamicanimation:dynamicanimation:1.0.0") }
Tạo ảnh động hất
Lớp FlingAnimation
cho phép bạn tạo ảnh động hất cho một đối tượng. Để tạo ảnh động hất, hãy tạo một bản sao của lớp FlingAnimation
và cung cấp một đối tượng cũng như thuộc tính của đối tượng mà bạn muốn tạo ảnh động.
Kotlin
val fling = FlingAnimation(view, DynamicAnimation.SCROLL_X)
Java
FlingAnimation fling = new FlingAnimation(view, DynamicAnimation.SCROLL_X);
Đặt tốc độ
Tốc độ bắt đầu xác định tốc độ thay đổi của một thuộc tính ảnh động ở đầu ảnh động. Tốc độ bắt đầu mặc định được đặt thành 0 pixel/giây. Do đó, bạn phải xác định tốc độ bắt đầu để đảm bảo ảnh động không kết thúc ngay lập tức.
Bạn có thể sử dụng một giá trị cố định làm tốc độ bắt đầu hoặc dựa trên tốc độ của một cử chỉ chạm. Nếu chọn cung cấp một giá trị cố định, bạn nên xác định giá trị đó theo dp/giây, sau đó chuyển đổi giá trị đó thành pixel/giây. Việc xác định giá trị theo dp/giây cho phép tốc độ không phụ thuộc vào mật độ và kiểu dáng của thiết bị. Để biết thêm thông tin về cách chuyển đổi vận tốc bắt đầu thành pixel/giây, hãy tham khảo phần Chuyển đổi dp/giây thành pixel/giây trong Ảnh động dựa trên lực lò xo.
Để thiết lập tốc độ, hãy gọi phương thức setStartVelocity()
và truyền tốc độ tính bằng pixel/giây. Phương thức này trả về đối tượng hất mà trên đó tốc độ được đặt.
Lưu ý: Sử dụng các lớp GestureDetector.OnGestureListener
và VelocityTracker
để truy xuất và tính toán tốc độ của cử chỉ chạm tương ứng.
Đặt phạm vi giá trị ảnh động
Bạn có thể đặt giá trị ảnh động tối thiểu và tối đa khi muốn hạn chế giá trị thuộc tính ở một phạm vi nhất định. Chế độ kiểm soát phạm vi này đặc biệt hữu ích khi bạn tạo ảnh động cho các thuộc tính có phạm vi nội tại, chẳng hạn như alpha (từ 0 đến 1).
Lưu ý: Khi giá trị của ảnh động hất đạt đến giá trị tối thiểu hoặc tối đa, ảnh động sẽ kết thúc.
Để đặt giá trị tối thiểu và tối đa, hãy gọi lần lượt các phương thức setMinValue()
và setMaxValue()
.
Cả hai phương thức đều trả về đối tượng ảnh động mà bạn đã đặt giá trị.
Đặt độ ma sát
Phương thức setFriction()
cho phép bạn thay đổi độ ma sát của ảnh động. Tham số này xác định tốc độ giảm của tốc độ trong ảnh động.
Lưu ý: Nếu bạn không đặt độ ma sát ở đầu ảnh động, ảnh động sẽ sử dụng giá trị độ ma sát mặc định là 1.
Phương thức này trả về đối tượng có ảnh động sử dụng giá trị ma sát mà bạn cung cấp.
Mã mẫu
Ví dụ dưới đây minh hoạ thao tác hất theo chiều ngang. Tốc độ được ghi lại từ trình theo dõi tốc độ là velocityX
và giới hạn cuộn được đặt thành 0 và maxScroll. Độ ma sát được đặt là 1.1.
Kotlin
FlingAnimation(view, DynamicAnimation.SCROLL_X).apply { setStartVelocity(-velocityX) setMinValue(0f) setMaxValue(maxScroll) friction = 1.1f start() }
Java
FlingAnimation fling = new FlingAnimation(view, DynamicAnimation.SCROLL_X); fling.setStartVelocity(-velocityX) .setMinValue(0) .setMaxValue(maxScroll) .setFriction(1.1f) .start();
Đặt thay đổi tối thiểu có thể nhìn thấy
Khi tạo ảnh động cho một thuộc tính tuỳ chỉnh không được xác định bằng pixel, bạn nên đặt mức thay đổi tối thiểu của giá trị ảnh động mà người dùng có thể nhìn thấy. Phương thức này xác định ngưỡng hợp lý để kết thúc ảnh động.
Bạn không cần gọi phương thức này khi tạo ảnh động cho DynamicAnimation.ViewProperty
vì thay đổi hiển thị tối thiểu được lấy từ thuộc tính. Ví dụ:
- Giá trị thay đổi hiển thị tối thiểu mặc định là 1 pixel cho các thuộc tính khung hiển thị như
TRANSLATION_X
,TRANSLATION_Y
,TRANSLATION_Z
,SCROLL_X
vàSCROLL_Y
. - Đối với ảnh động sử dụng tính năng xoay, chẳng hạn như
ROTATION
,ROTATION_X
vàROTATION_Y
, thay đổi hiển thị tối thiểu làMIN_VISIBLE_CHANGE_ROTATION_DEGREES
hoặc 1/10 pixel. - Đối với ảnh động sử dụng độ mờ, thay đổi tối thiểu có thể nhìn thấy là
MIN_VISIBLE_CHANGE_ALPHA
hoặc 1/256.
Để đặt thay đổi tối thiểu có thể nhìn thấy cho ảnh động, hãy gọi phương thức setMinimumVisibleChange()
và truyền một trong các hằng số tối thiểu có thể nhìn thấy hoặc một giá trị mà bạn cần tính toán cho một thuộc tính tuỳ chỉnh. Để biết thêm thông tin về cách tính giá trị này, hãy tham khảo phần Tính giá trị thay đổi tối thiểu có thể nhìn thấy.
Kotlin
anim.minimumVisibleChange = DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE
Java
anim.setMinimumVisibleChange(DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE);
Lưu ý: Bạn chỉ cần truyền một giá trị khi tạo ảnh động cho một thuộc tính tuỳ chỉnh không được xác định bằng pixel.
Tính giá trị thay đổi tối thiểu có thể nhìn thấy
Để tính toán giá trị thay đổi tối thiểu có thể nhìn thấy cho một thuộc tính tuỳ chỉnh, hãy sử dụng công thức sau:
Thay đổi tối thiểu có thể nhìn thấy = Phạm vi giá trị thuộc tính tuỳ chỉnh / Phạm vi ảnh động tính bằng pixel
Ví dụ: thuộc tính mà bạn muốn tạo ảnh động sẽ tiến từ 0 đến 100. Điều này tương ứng với thay đổi 200 pixel. Theo công thức, giá trị thay đổi tối thiểu có thể nhìn thấy là 100 / 200 bằng 0,5 pixel.