Статьи

Использование ViewPager для создания скользящего экрана в Android

Android предоставляет множество элементов управления UI для создания красивых экранов UI для ваших приложений. Одним из общих требований к пользовательскому интерфейсу является скольжение между несколькими экранами. Например, слайд-шоу с фотографиями. Android предоставляет пользовательский интерфейс для создания скользящих экранов, который называется ViewPager . В этом руководстве объясняется использование ViewPager для создания скользящего экрана в ваших приложениях для Android.

Вы можете найти код для этой статьи на GitHub

Добавление View Pager к вашей активности

Создайте новый пустой проект Activity и начните с добавления ViewPager в действие. Как и любой другой элемент управления пользовательского интерфейса, вы определяете ViewPager в файле макета. Измените activity_main.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:orientation="vertical"> <android.support.v4.view.ViewPager android:id="@+id/vpPager" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v4.view.PagerTabStrip android:id="@+id/pager_header" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="top" /> </android.support.v4.view.ViewPager> </LinearLayout> 

В приведенном выше макете есть LinearLayout, содержащий ViewPager с идентификатором «vpPage». Есть также вложенное представление PagerTabStrip которое указывает вкладки в верхней части экрана в зависимости от количества страниц в ViewPager. После создания макета обновите файл MainActivity.java, чтобы использовать этот макет следующим образом:

 package com.viewpagerandroid; // Update to match your package import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ViewPager vpPager = (ViewPager) findViewById(R.id.vpPager); } } 

В приведенном выше коде я MainActivity которая устанавливает макет, созданный как его представление содержимого. Затем он запрашивает ссылку на ViewPager с помощью функции findViewById .

Создание фрагментов для ViewPager

Вы должны определить каждый экран в ViewPager как фрагмент. Каждый экран может быть экземпляром разных классов фрагментов или разными экземплярами одного и того же класса фрагмента с различным содержанием. Это приложение будет содержать три экрана. Два экрана с одним текстовым полем и одним изображением, и один экран с одним текстовым полем и двумя изображениями. Исходя из этого, вам понадобятся два класса фрагментов.

Классы макетов и фрагментов:

fragment_one_img.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/txtMain" android:layout_width="match_parent" android:layout_height="wrap_content" /> <ImageView android:id="@+id/imgMain" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 

FragmentWithOneImage.java

 package com.viewpagerandroid; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; public class FragmentWithOneImage extends Fragment { private String title; private int image; public static FragmentWithOneImage newInstance(String title, int resImage) { FragmentWithOneImage fragment = new FragmentWithOneImage(); Bundle args = new Bundle(); args.putInt("image", resImage); args.putString("title", title); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); image = getArguments().getInt("image", 0); title = getArguments().getString("title"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_one_img, container, false); TextView tvLabel = (TextView) view.findViewById(R.id.txtMain); tvLabel.setText(title); ImageView imageView = (ImageView) view.findViewById(R.id.imgMain); imageView.setImageResource(image); return view; } } 

fragment_two_images.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/txtMain" android:layout_width="match_parent" android:layout_height="wrap_content" /> <ImageView android:id="@+id/imgMain" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:id="@+id/imgSecondary" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 

FragmentWithTwoImages.java

 package com.viewpagerandroid; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; public class FragmentWithTwoImages extends Fragment { private String title; private int imageMain; private int imageSecondary; public static FragmentWithTwoImages newInstance(String title, int resMainImage, int resSecondaryImage) { FragmentWithTwoImages fragment = new FragmentWithTwoImages(); Bundle args = new Bundle(); args.putInt("imageMain", resMainImage); args.putInt("imageSecondary", resSecondaryImage); args.putString("title", title); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); imageMain = getArguments().getInt("imageMain", 0); imageSecondary = getArguments().getInt("imageSecondary", 0); title = getArguments().getString("title"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_two_images, container, false); TextView tvLabel = (TextView) view.findViewById(R.id.txtMain); tvLabel.setText(title); ImageView imageView = (ImageView) view.findViewById(R.id.imgMain); imageView.setImageResource(imageMain); ImageView imageViewSecondary = (ImageView) view.findViewById(R.id.imgSecondary); imageViewSecondary.setImageResource(imageSecondary); return view; } } 

В приведенном выше коде FragmentWithOneImage , имеет метод getInstance который принимает текст и идентификатор ресурса изображения, отображаемый во фрагменте. Фрагмент раздувает макет frag_one_img.xml и устанавливает текст и идентификатор ресурса изображения. Точно так же FragmentWithTwoImages раздувает макет frag_two_images.xml и устанавливает текст и оба идентификатора ресурса изображения.

Реализация PagerAdapter

Теперь, когда вы создали фрагменты, вам нужен PagerAdapter который вы установите в ViewPager . Хотя вы можете напрямую расширяться из PagerAdapter , Android предоставляет другой базовый класс FragmentPagerAdapter который реализует базовые функциональные возможности для отображения фрагментов в виде страниц в PagerAdapter .

Расширьте адаптер из FragmentPagerAdapter , добавив этот класс в MainActivity.java :

 public static class MyPagerAdapter extends FragmentPagerAdapter { private static int NUM_ITEMS = 3; public MyPagerAdapter(FragmentManager fragmentManager) { super(fragmentManager); } // Returns total number of pages. @Override public int getCount() { return NUM_ITEMS; } // Returns the fragment to display for a particular page. @Override public Fragment getItem(int position) { switch (position) { case 0: return FragmentWithOneImage.newInstance("Fragment 1", R.drawable.android_1); case 1: return FragmentWithOneImage.newInstance("Fragment 2", R.drawable.android_2); case 2: return FragmentWithTwoImages.newInstance("Fragment 3", R.drawable.android_3, R.drawable.android_4); default: return null; } } // Returns the page title for the top indicator @Override public CharSequence getPageTitle(int position) { return "Tab " + position; } } 

Примечание : вам нужно будет добавить изображения, указанные выше. Вы можете найти их здесь .

Класс MyPagerAdapter расширяется от FragmentPagerAdapter и переопределяет метод getCount который возвращает количество страниц, отображаемых адаптером. В этом примере вы хотите показать три страницы, а он возвращает три. Метод getItem возвращает экземпляр фрагмента для отображения на экране. Метод getPageTitle возвращает заголовок конкретной страницы. Как только вы создали MyPagerAdapter вам нужно установить его экземпляр на ViewPager в функции onCreate как onCreate ниже:

 FragmentPagerAdapter adapterViewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ViewPager vpPager = (ViewPager) findViewById(R.id.vpPager); adapterViewPager = new MyPagerAdapter(getSupportFragmentManager()); vpPager.setAdapter(adapterViewPager); } 

Если вы запустите приложение, вы увидите три экрана, между которыми вы можете перемещаться, как показано ниже.

Экран 1

Экран 2

Экран 3

Добавление анимации на слайд экрана

Вы можете реализовать различные анимации на слайде страницы, установив ViewPager.PageTransformer . Чтобы реализовать это, вы должны переопределить метод transformPage . В этой функции вы предоставляете пользовательские анимации, основанные на позиции на экране, есть много доступных преобразований в виде библиотек с открытым исходным кодом, которые вы можете использовать, например, ToxicBakery.ViewPagerTransforms .

Чтобы использовать пользовательскую анимацию, добавьте ее в свои зависимости в build.gradle (Module: App) следующим образом:

 dependencies { ... compile 'com.ToxicBakery.viewpager.transforms:view-pager-transforms:1.2.32@aar' } 

Теперь вы можете добавить PageTransformer в ViewPager в методе onCreate как показано ниже:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ViewPager vpPager = (ViewPager) findViewById(R.id.vpPager); adapterViewPager = new MyPagerAdapter(getSupportFragmentManager()); vpPager.setAdapter(adapterViewPager); vpPager.setPageTransformer(true, new RotateUpTransformer()); } 

Теперь, если вы запустите приложение и сдвинете экраны, они будут вращаться во время скольжения.

Следующая страница

ViewPager управления ViewPager предоставляемый Android, позволяет легко добавлять гибкие скользящие экраны в ваше приложение и дает вам возможность добавлять одинаковые или разные типы страниц на скользящие экраны.

Дайте мне знать, если у вас есть какие-либо комментарии или вопросы .