Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách sử dụng ViewFlipper trong Android

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ứcMô 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ểmViewFlipperViewPager / ViewPager2
Cuộn bằng tay (swipe)Không hỗ trợHỗ trợ gốc
Adapter patternKhông (addView trực tiếp)Có (PagerAdapter)
Tải lười (lazy load)KhôngCó (offscreenPageLimit)
Phù hợp choSlideshow đơn giản, banner, ít itemDanh 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() trong onPause() để 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