Giới thiệu
Bài viết này hướng dẫn sử dụng ViewFlipper – một ViewGroup hiển thị các child view lần lượt (chỉ một view hiển thị tại một thời điểm), hỗ trợ animation chuyển đổi và tự động lặp (auto-flip). Phù hợp cho slideshow, banner, tutorial screens.
Các bước thực hiện
Bước 1: Tạo dự án mới
Mở Android Studio, chọn File → New Project và tạo dự án.
Bước 2: Thiết kế giao diện (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ViewFlipper
android:id="@+id/viewFlipper"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:inAnimation="@android:anim/slide_in_left"
android:outAnimation="@android:anim/slide_out_right">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/image" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Button View"
android:textSize="48sp"
android:textStyle="bold" />
</ViewFlipper>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true"
android:layout_margin="16dp"
android:onClick="previousView"
android:text="Trước" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_margin="16dp"
android:onClick="nextView"
android:text="Sau" />
</RelativeLayout>
Bước 3: Tạo animation tùy chỉnh (res/anim/)
slide_in_right.xml (res/anim/slide_in_right.xml)
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="https://schemas.android.com/apk/res/android">
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:fromXDelta="50%p"
android:toXDelta="0" />
<alpha
android:duration="@android:integer/config_mediumAnimTime"
android:fromAlpha="0.0"
android:toAlpha="1.0" />
</set>
slide_out_left.xml (res/anim/slide_out_left.xml)
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="https://schemas.android.com/apk/res/android">
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:fromXDelta="0"
android:toXDelta="-50%p" />
<alpha
android:duration="@android:integer/config_mediumAnimTime"
android:fromAlpha="1.0"
android:toAlpha="0.0" />
</set>
Bước 4: Viết code logic (src/MainActivity.java)
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.TextView;
import android.widget.ViewFlipper;
public class MainActivity extends AppCompatActivity {
private ViewFlipper viewFlipper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewFlipper = findViewById(R.id.viewFlipper);
// Thêm view động (programmatically)
TextView textView = new TextView(this);
textView.setText("View thêm động bằng code");
textView.setGravity(Gravity.CENTER_HORIZONTAL);
textView.setTextSize(24);
textView.setPadding(32, 32, 32, 32);
viewFlipper.addView(textView);
// Tự động lặp (auto-flip) mỗi 2 giây
viewFlipper.setFlipInterval(2000);
viewFlipper.startFlipping();
}
// Xử lý nút "Trước" (android:onClick="previousView")
public void previousView(View v) {
viewFlipper.setInAnimation(this, R.anim.slide_in_right);
viewFlipper.setOutAnimation(this, R.anim.slide_out_left);
viewFlipper.showPrevious();
}
// Xử lý nút "Sau" (android:onClick="nextView")
public void nextView(View v) {
viewFlipper.setInAnimation(this, android.R.anim.slide_in_left);
viewFlipper.setOutAnimation(this, android.R.anim.slide_out_right);
viewFlipper.showNext();
}
}
Bước 5: Cấu hình AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.com.sample">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Chạy ứng dụng
Kết nối thiết bị, nhấn Run. ViewFlipper tự động chuyển đổi giữa ImageView, Button, và TextView động mỗi 2 giây. Nhấn nút "Trước"/"Sau" để điều khiển thủ công với animation tùy chỉnh.
Các phương thức ViewFlipper quan trọng
| Phương thức | Mô tả |
|---|---|
| showNext() | Hiển thị view tiếp theo |
| showPrevious() | Hiển thị view trước đó |
| setDisplayedChild(index) | Nhảy đến view tại index (0-based) |
| startFlipping() | Bắt đầu auto-flip |
| stopFlipping() | Dừng auto-flip |
| setFlipInterval(millis) | Thời gian giữa các lần flip (ms) |
| setInAnimation(animation) | Animation khi view xuất hiện |
| setOutAnimation(animation) | Animation khi view biến mất |
| addView(View) | Thêm view con (tối đa 1 hiển thị tại một lúc) |
ViewFlipper vs ViewPager vs ViewPager2
| Đặc điểm | ViewFlipper | ViewPager / ViewPager2 |
|---|---|---|
| Cuộn bằng tay (swipe) | Không hỗ trợ | Hỗ trợ gốc |
| Adapter pattern | Không (addView trực tiếp) | Có (PagerAdapter) |
| Tải lười (lazy load) | Không | Có (offscreenPageLimit) |
| Phù hợp cho | Slideshow đơn giản, banner, ít item | Danh sách nhiều trang, tab, gallery |
Lưu ý
- ViewFlipper không hỗ trợ swipe gesture – cần tự implement OnTouchListener nếu muốn
- Gọi
stopFlipping()trongonPause()để tiết kiệm tài nguyên - Animation hệ thống:
android.R.anim.slide_in_left,slide_out_right,fade_in,fade_out - Đối với danh sách phức tạp, hãy dùng ViewPager2 + FragmentStateAdapter