Penggunaan mudah ViewPager


Pengenalan kepada bahagian ini:

Apa yang dibawa oleh bahagian ini ialah kawalan UI yang diperkenalkan selepas Android 3.0 - ViewPager (lihat alat pensuisan gelongsor), yang benar-benar tidak dijangka Bagaimana untuk memanggil kawalan ini? Fungsi amnya: Pensuisan paparan boleh diselesaikan melalui gelongsor gerak isyarat Ia biasanya digunakan untuk APP. Halaman but atau karusel imej, kerana ia diperkenalkan selepas 3.0 Jika anda ingin menggunakannya dalam versi yang lebih rendah, anda perlu memperkenalkan v4 Pakej keserasian~, kita juga dapat melihat bahawa ViewPager berada dalam: direktori android.support.v4.view.ViewPager~ Mari belajar penggunaan asas kawalan ini~ Dokumen API rasmi: ViewPager


1 Pengenalan ringkas ViewPager

ViewPager ialah komponen penukaran halaman yang mudah, kita boleh pergi ke. Isi dengan berbilang Paparan, dan kemudian kita boleh pergi Leret ke kanan untuk menukar Paparan yang berbeza Kami boleh setPageTransformer() kaedah untuk ViewPager kami Tetapkan kesan animasi apabila bertukar Sudah tentu, kami belum mempelajari animasi lagi, jadi kami menetapkan animasi untuk ViewPager Mari kita serahkan kepada bab seterusnya, Lukisan dan Animasi! Seperti ListView dan GridView yang kami pelajari sebelum ini, kami juga memerlukan Penyesuai (Penyesuai) mengikat View dan ViewPager kami, dan ViewPager mempunyai Penyesuai khusus - PagerAdapter! Selain itu, Google secara rasmi mengesyorkan agar kami menggunakan Fragment untuk mengisi ViewPager, jadi Adalah lebih mudah untuk menjana setiap Halaman dan mengurus kitaran hayat setiap Halaman! Kami dibekalkan dengan dua Fragmen Penyesuai Khusus: FragmentPageAdapter dan FragmentStatePagerAdapter Mari kita analisa secara ringkas perbezaan antara kedua-dua Penyesuai ini:

  • FragmentPageAdapter:FragmentPageAdapter:< hanya akan cache Fragmen semasa dan yang di sebelah kiri dan yang di sebelah kanan. Satu, iaitu, sejumlah 3 Fragmen akan dicache Jika terdapat empat halaman 1, 2, 3, dan 4:
    berada di halaman 1: cache 1, 2
    berada di halaman 2: cache 1. , 2, 3
    Di halaman 3: musnahkan halaman 1, cache 2, 3, 4
    Pada halaman 4: musnahkan halaman 2, cache 3, 4
    Untuk lebih banyak halaman dan seterusnya~
  • FragmentStatePagerAdapter: Apabila Fragment tidak berguna kepada pengguna Apabila dilihat, seluruh Fragmen akan musnah. Hanya keadaan Fragmen akan disimpan! Apabila halaman perlu dipaparkan semula, halaman baharu akan dijana!

Ringkasnya, FragmentPageAdapter sesuai untuk acara dengan halaman tetap yang lebih sedikit manakala FragmentStatePagerAdapter sesuai untuk Untuk situasi di mana terdapat banyak halaman atau kandungan halaman adalah sangat kompleks (ia memerlukan banyak memori)!


2. Penggunaan PagerAdapter

Mari kita perkenalkan PagerAdapter yang paling biasa Jika anda ingin menggunakan PagerAdapter ini, anda perlu menulis semula empat kaedah berikut : Sudah tentu, ini hanyalah cadangan rasmi Sebenarnya, kita hanya perlu menulis semula getCount() dan isViewFromObject()~

  • getCount(): Dapatkan bilangan paparan yang terdapat dalam halaman paparan
  • destroyItem(): Alih keluar halaman pada kedudukan tertentu. Adalah menjadi tanggungjawab penyesuai untuk mengalih keluar paparan ini daripada bekas. Ini adalah untuk memastikan paparan boleh dialih keluar apabila finishUpdate(viewGroup) kembali.

Dua kaedah lain melibatkan kunci:

  • instantiateItem(): ①Tambahkan paparan pada kedudukan yang diberikan pada ViewGroup (bekas), buat dan paparkannya ②Kembalikan Objek (kunci) yang mewakili halaman yang baru ditambah Biasanya, ia sudah cukup untuk mengembalikan paparan itu sendiri. Sudah tentu, anda juga boleh Sesuaikan kunci anda sendiri, tetapi kunci mesti mempunyai surat-menyurat satu dengan satu dengan setiap paparan
  • isViewFromObject(): Tentukan sama ada Kunci yang dikembalikan oleh fungsi instantiateItem(ViewGroup, int) adalah sama dengan paparan halaman mewakili pandangan yang sama (iaitu, sama ada ia sepadan, dan yang sepadan mewakili Paparan yang sama), biasanya kita menulis secara langsung pandangan kembali == objek!

Contoh penggunaan 1: Penggunaan paling mudah

Menjalankan rendering:

1.gif

Bahagian utama kod:

Baiklah, kod ini sangat mudah untuk ditulis: pertama ialah reka letak setiap Paparan, dalam tiga kali ganda dan dua Paparan yang lain sama :

view_one.xml

<?xml version="1.0" encoding="utf-8"?>
< LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background =" ../style/images/android-tutorial-viewpager.html"
android:gravity="center"
android:orientation="vertical">

<TextView
android :layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Halaman Pertama"
android:textColor="#000000"
android:textSize="18sp"
android:textStyle="bold" />
</LinearLayout>

然后编写一个自定义个的PagerAdapter:

MyPagerAdapter.java

public class Pager Adapter MyPagtender  peribadi ArrayList<Lihat> ; viewLists;

    public MyPagerAdapter() {
    }

    public MyPagerAdapter(ArrayList<View> viewLists) {
       ;    superview = Senarai pandangan;
}

@Override
public int getCount () { return viewLists.size (); }

@Override
public boolean isviewFromObject (Lihat lihat, objek objek) {
        return view == objek;
    }

    @Override
    awam Objek instantiateItem(Lihat bekas                                    + senarai pandangan. get(position));
        return viewLists.get(position);
    }

    @Override
    public void destroyItem(ViewGroup container, int object >  Object container < contain object),  objek .removeView(viewLists.get(position));
    }
}

接着到Aktiviti了,和以前学的ListView非常类似:

OneActivity.java

Kelas Aplikasi<🎜 >Aplikasi 🎜>
    pribadi ViewPager vpager_one;
    pribadi ArrayList<View> aList;
    pribadi MyPagerAdapter mAdapter;

    @Override
    dilindungi void onCreate(Bundle savedInstanceState) {
                                                                                                                                                                                     dilindungi   setContentView(R.layout.activity_one);
        vpager_one = (ViewPager) findViewById(R.id.vpager_one);

        aList = baharu ArrayList<Lihat>();<🎜       (li keluar >   (li dalam >    () 🎜>        aList.add( li.inflate(R.layout.view_one,null,false));
         aList.add(li.inflate(R.layout.view_two,null,false));
        aList.add(li.inflate(( R.layout.view_three,null,false));
        mAdapter = new MyPagerAdapter(aList);
        vpager_one.setAdapter(mAdapter);
     }
 }<🎜

Baiklah, kod kunci adalah bahagian di atas, ia sangat mudah difahami~


Contoh penggunaan 2: Title bar - PagerTitleStrip dan PagerTabStrip

ialah untuk ikuti gelongsor ViewPager Bagi tajuk gelongsor, kedua-dua ini disediakan secara rasmi, satu ialah teks biasa, Satu digariskan, dan teks boleh diklik untuk menukar halaman Mari kita tulis contoh mudah~

Menjalankan pemaparan :

2.gif

Pelaksanaan kod utama:

Perbezaan antara kedua-duanya di sini cuma susun aturnya berbeza, yang lain adalah sama:

PagerTitleStrip The susun atur Activtiy di mana terletak: activity_two.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
         android:        android:          android:                     android ./style/images/android-tutorial-viewpager.html"
        android:gravity="center"
        android:text="PagerTitleStrip效果演示"
             android android:textSize="18sp" />

    <android.support.v4.view.ViewPager
        ="android:id="@+id/vpager_two"
            android "
         android:layout_height="wrap_content"
        android:layout_gravity="center">

        <android. support.v4.view .                    android id/pagertitle"
            android:layout_width="wrap_content"
                                                                                  android textColor="../style/images/android -tutorial-viewpager.html" />
   </android.support.v4.view.ViewPager>

</LinearLayout>

而PagerTabStrip所在的布局:

activity_three.xml

<LinearLayout xmlns:android="id.schema/android="idhttp://http://http:// com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

;    Lihat< 🎜>        android:layout_width="match_parent"
         android:layout_height="35dp"
        android:background="../style/images/android-tutorial-viewpager.html>"  Pusat " android: text =" pagerTabstrip 效果 演示 "
android: textSize =" 18sp "/& gt;

& lt; android.support.v4.view.viewpager
android: id ="@+id/vpager_three"
         android:layout_width="wrap_content"
        android:lay out_height="wrap_content"
        android:<"  gravity="🎜>         android:<”  gravity="🎜 ; android. support.v4.view.PagerTabStrip
            android:id="@+id/pagertitle"
             android:layout_width="wrap_content"
                                                         android      android:layout_gravity="top " />
     </android.support.v4.view.ViewPager>
</LinearLayout>

Dua yang seterusnya adalah sama Mari kita tulis PagerAdapter tersuai, kecuali yang ditulis semula sebelum ini. Sebagai tambahan kepada empat kaedah, kita perlu menulis semula kaedah lain: getPageTitle(), yang menetapkan tajuk~ Kodnya adalah seperti berikut:

MyPagerAdapter2.java

/**
 * Dibuat oleh Jay pada 2015/10/8 0008.
 */
kelas awam MyPagerAdapter2 memanjangkan PagerAdapter {
ArrayList< ;Lihat> viewLists;
peribadi ArrayList<String> titleLists;

awam MyPagerAdapter2() {}
awam MyPagerAdapter2(ArrayList<Array<title>Lists>Lihat>Lists > {
this.viewLists = viewLists;
this.titleLists = titleLists;
}

@Override
public int getCount() {
return viewLists() ;
}

@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(viewLists.get(position));
return viewLists.get(position);
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(viewLists.get(position));
}

@Override
public CharSequence getPageTitle (int position ) {
return titleLists.get(position);
}
}

最后是Aktiviti部分,两个都是一样的:

TwoActivity.java

/*/🎜 >kelas awam TwoActivity melanjutkan AppCompatActivity {

    pribadi ViewPager vpager_two;
    pribadi ArrayList<View> aList;
    peribadi ArrayList<String> sList;
    pribadi MyPagerAdapter2 mAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
 (        State semula);     setContentView(R.layout.activity_two);
        vpager_two = (ViewPager) findViewById(R.id.vpager_two);
        aList = baharu ArrayList<Lihat>();
   La   ;
         ;
         ; 🎜>        aList.add(li.inflate (R.layout.view_one,null,false));
        aList.add(li.inflate(R.layout.view_two,null,false));
        aList.add(li.inflate(R.layout .view_three, null, false));
        sList = new ArrayList<String>();
        sList.add("橘黄");
    L ist add sList.add("浅棕");
        mAdapter = new MyPagerAdapter2(aList,sList);
        vpager_two.setAdapter(mAdapter);<🎜<><🎜 

Baiklah, ia sangat mudah Jika anda mempunyai sebarang soalan, muat turun demo dan anda akan faham~


Contoh penggunaan 3: ViewPager melaksanakan kesan TabHost:

Sudah tentu, Contoh 2 selalunya hanya idea yang bagus tetapi tidak berguna dalam pembangunan sebenar, kita mungkin perlu menyesuaikan bar tajuk ini sendiri. Sekarang mari tulis contoh mudah untuk mencapai kesan TabHost Jika anda tidak tahu apa itu TabHost Jika ya, sila lihat rendering!

Penyampaian operasi:

3.gif

Laksanakan analisis logik:

Jom terangkan logik untuk mencapai kesan di atas, dan kemudian tampal kod:

Pertama ialah reka letak: LinearLayout di bahagian atas, dibalut dalam tiga TextViews, dengan atribut berat ditetapkan kepada 1, dan kemudian berikut Untuk ImageView peluncur, kami menetapkan lebar kepada match_parent bahagian bawah ialah ViewPager kami, yang mungkin Terdapat dua sifat yang anda tidak tahu Satu ialah: flipInterval: Ini menentukan selang masa antara Lihat animasi.
Dan persistentDrawingCache: menetapkan strategi cache lukisan bagi kawalan Terdapat empat nilai pilihan:

  • tiada: jangan simpan cache lukisan dalam memori animasi :Hanya simpan cache lukisan animasi;
  • menatal: Hanya simpan cache lukisan kesan tatal; masa yang sama 2, animasi|menatal seperti ini~
  • Kod susun atur:
activity_four.xml

:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android: orientation="vertical"               android =".MainActivity">

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="48dp>"     background .               android /Android-tutorial-viewpager.html "& gt;

& lt; textView
android: id ="@+id/tv_one " android: Layout_width =" fill_parent "
="fill_parent"
            android:layout_weight="1.0"
             android:grav ity="center"
             android:text=" 橘黄                                 android 0" />

& lt; textView
android: id = "@+id/tv_two"
android: Layout_width = "fill_parent"
android: Layout_height = "fill_parent" "
            android:gravity="center"
            android:text="淡黄"
            android:textColor="#00 000"< /> Lihat
            android: id="@+id/tv_three"
            android: Layout_Width = "fill_parent"
android: Layout_height = "fill_parent"
android: Layout_weight = "1.0"
android: gravity = "center"
android: text = "浅棕" > Android: textColor = "#000000"/& gt;
& lt;/linearlayout & gt;

& lt; imageView
android: id = "@+id/img_cursor" "fill_parent"
        android:layout_height="wrap_content"
         android:scaleType="matrix"
        android:src="@mipmap/id" /> ;              />            android .v4.view.ViewPager
        android:id="@+id/vpager_four"
         android:layout_width="wrap_content"
        android:layout_" layout_
        android:layout_weight="1.0"
        android:flipInterval="30"
        android:out> 🎜>

Seterusnya ialah Aktiviti kita, mari kita fikirkan:

  • Langkah 1: Kita perlu meletakkan blok bergerak kita dahulu Jika teks ditengah di bawah teks, maka offset perlu dikira di sini: Mula-mula dapatkan lebar imej pw, dan kemudian dapatkan lebar skrin sw Kaedah pengiraan adalah sangat mudah:
    offset (offset) = ((sw / 3)-pw) / 2 //Skrin. lebar/3 -Lebar gambar, dan kemudian bahagikannya dengan 2, kanan atau kiri!
    Kemudian kami memanggil setImageMatrix untuk menetapkan kedudukan semasa peluncur:
    Pada masa yang sama, kami juga bertukar antara satu halaman dan dua halaman dan mengira jarak bergerak peluncur Ia sangat mudah:
    satu = offset * 2 + pw;
    dua = satu * 2;

  • Langkah 2: Apabila kita meluncur halaman , peluncur kita perlu bergerak, kita perlu menambah a Acara OnPageChangeListener, kita perlu membuat pertimbangan pada halaman selepas meluncur dan merekod halaman sebelum meluncur. Halaman mana, saya lukis gambar di bawah, mungkin lebih mudah untuk difahami!

PS: Sudah terlalu lama saya tidak menulis 4.jpg

5.png

Nah, jika anda masih tidak memahaminya, anda boleh lukis sendiri kodnya:

FourActvitiy.java:

/**
 * Dibuat oleh Jay pada 2015/10/8 0008.
 */
kelas awam FourActivity memanjangkan AppCompatActivity melaksanakan View.OnClickListener,
ViewPager.OnPageChangeListener {

private ViewPager🎜> private ViewPager🎜curv>< ;
peribadi TextView tv_one;
peribadi TextView tv_two;
peribadi TextView tv_three;

peribadi ArrayList<Lihat> listViews;
private int offset = 0;
private int currIndex = 0; //Nombor halaman semasa
private int bmpWidth; // Panjang imej bar bergerak
private int one = 0; dengan satu halaman
private int two = 0; //Jarak peluncur bergerak antara dua halaman

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState) ;
setContentView(R.layout.activity_four);
initViews();
}


private void initViews() {
vpager_four = (ViewPager) findViewById(R .id.v pager_four );
tv_one = (TextView) findViewById(R.id.tv_one);
tv_two = (TextView) findViewById(R.id.tv_two);
tv_three = (BytIdView) find (R.id. tv_three);
img_cursor = (ImageView) findViewById(R.id.img_cursor);

//Tetapan berkaitan untuk animasi garis bawah:
bmpWidth = BitmapFactory.decodeResource(getResources ( ), R.mipmap .line).getWidth(); // Dapatkan lebar imej
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int screenW = dm.widthPixels; //Dapatkan lebar peleraian
offset = (screenW / 3 - bmpWidth) / 2;// Kira offset
Matriks matriks = new Matrix();
matrix.postTranslate(offset, 0);
img_cursor.setImageMatrix(matrix) ;/ /Tetapkan kedudukan awal animasi
                                                                                                                                                                                                                                                                                                                                                                                                                                    // Jarak bergerak 🎜> Dua = satu * 2;//Pindahkan offset dua halaman, sebagai contoh, 1 lompat terus ke 3


listViews = ArrayList<View>();
LayoutInflater mInflater = getLayoutInflater();
listViews.add(mInflater.inflate(R.layout.view_one, null, false));
listViews.add(( mInflater.inflate(R.layout.view_two, null, false));
listViews.add(mInflater.inflate(R.layout.view_three, null, false));
vpager_four.setAdapter(new MyPagerAdapter(listViews ));
vpager_four.setCurrentItem(0); 🎜> tv_three.setOnClickListener(this);

vpager_four.addOnPageChangeListener(this);
}

public void onClick(View v) {
suis (v. getId()) {
case R.id.tv_one:
vpager_four.setCurrentItem(0);
break;
case R .id .tv_two:
                vpager_four.setCurrentItem (1); >    @Override
    public void onPageSelected(int index) {
        Animation animasi = null;
        tukar (indeks) {
                                                                                                                                                             jika (currIndex == 1) {
animasi = translateAnimation baru (satu, 0, 0, 0);
} else if (currIndex == 2) {
animation = new translateanimation (dua, 0, 0, 0);
}
Break;
kes 1:
if (currIndex == 0) {
animation = new translateanimation (offset, one, 0, 0);
} else if (currindex == 2) {
                    animasi = baharu TranslateAnimation(dua, satu, 0, 0);
                }
                                                                                                                                      kes 2:
if (currIndex == 0) {
animasi = TranslateAnimation baharu(offset, two, 0, 0);
else if (curr Index == 1) {
                      =       animasi baharu TranslateAnimation(satu, dua, 0, 0);
}
break;
}
currIndex = index;
animation.setFi llAfter(true); // true bermaksud gambar berhenti di penghujung animasi Position
animation.setDuration(300); //Tetapkan masa animasi kepada 300 milisaat
img_cursor.startAnimation(animation);//Mulakan animasi
}

@Override
public void onPageScrollStateChanged(int i) {

}

@Override
public void onPageScrolled(int i, float v, int i1) {

}
}

Nah, anda mungkin tidak biasa dengan animasi, tidak mengapa, kami akan membawa anda melalui bab seterusnya~


3. ViewPager contoh

Nah, apabila kami menerangkan Fragment sebelum ini, kami menerangkan contoh penggunaan: Pengenalan Asas kepada Tutorial Android - 5.2.4 Contoh Fragmen - Bar Navigasi Bawah + ViewPager Slaid ke Tukar Halaman Saya tidak akan pergi ke butiran di sini. Jika anda berminat, hanya klik pada pautan untuk melihat~


4. Muat turun contoh kod

ViewPagerDemo.zip


Ringkasan bahagian ini:

Mengenai ViewPager, kerana batasan ruang, beberapa tempat tidak disebutkan. Di samping itu, seperti yang dinyatakan di atas, kami akan membincangkan animasi ViewPager di bawah. Okay, itu sahaja~

Baiklah, sebelum Hari Kebangsaan, saya cakap saya akan habiskan keseluruhan siri semasa cuti Hari Kebangsaan, tetapi akhirnya saya tidak menulis satu bab pun ... Kerana gadis itu datang untuk bermain, jadi, anda tahu~

, saya akan mempercepatkan kemajuan~ dan berusaha untuk maju secepat mungkin!

6.gif