Giới thiệu
Chắc nhiều bạn đã thấy nhiều app có 1 list view với 1 header mà khi bạn scroll xuống dưới thì chiều cao header cũng ngắn lại và thêm 1 số animation khác.
Nay mình sẽ hướng dẫn làm hiệu ứng đó sử dụng Animated API trong react-native.
Bí mật hậu trường
Ý tưởng đằng sau là chúng ta sẽ tạo 1 header nằm trên scrollview sử dụng position ‘absolute’.
Chiều cao của header sẽ được điều chỉnh dựa vào offset Y của scrollView khi scroll. Offset Y này được lấy từ callback onScroll của scrollview.
Thực hiện
1 | this.scrollY = new Animated.Value(0) |
Ở trên scrollY là biến dùng để quản lý animation khi scroll, biến này được gán giá trị với contentOffset y của scrollView.
scrollEventThrottle dùng để điều khiển tần suất số lần gọi scroll event khi scroll,
hay nói cách khác là định nghĩa bao nhiêu lần trong 1s chúng ta muốn thực thi event onScroll,
giá trị càng nhỏ thì độ chính xác càng cao nhưng sẽ làm ảnh hưởng scroll performance của scrollview.
Ở Header View:
1 | const MIN_HEIGHT = 65 |
Chú ý trong interpolate ta thêm extrapolate: ‘clamp’
nhằm ngăn không cho output value vượt ra ngoài ouputRange. Giá trị mặc định của extrapolate là extend
Và đây là kết quả:
Cải thiện
Ở trên chúng ta chỉ sử dụng translateY aimation, chúng ta nên kết hợp các animation khác như opacity, scale.. để headerView trở nên cool hơn.
Việc sử dụng {useNativeDriver: true} như ở trên rất quan trọng nếu bạn muốn app của bạn không bị lag khi có nhiều xử lý chiếm nhiều cpu.
Bạn hãy thử bỏ đi sử dụng useNativeDriver và thêm đoạn code dưới vào app, bạn sẽ thấy sự khác biệt.
1 | runCPUburner = () => { |