Android ViewPager с точками внизу

Я хочу добавить 3 нижние точки к моему ViewPager, вот так.

3 нижние точки3 нижние точки 3 нижние точки

Я использую FragmentActivity и поддерживаю библиотеку ViewPager.


comment
Мне нужно добавить точки, а не вкладки (как в программе запуска Nexus 5).   -  person Kfir Guy    schedule 14.12.2013
comment
Ознакомьтесь с моим решением: stackoverflow.com/a/38459310/4631935   -  person RediOne1    schedule 17.10.2016


Ответы (10)


Не нужно столько кода.

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

Ваш основной макет:

<RelativeLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:layout_width="match_parent"
   android:layout_height="wrap_content">

   <android.support.v4.view.ViewPager
       android:id="@+id/pager"
       android:layout_width="match_parent"
       android:layout_height="match_parent">

   </android.support.v4.view.ViewPager>
   <android.support.design.widget.TabLayout
       android:id="@+id/tabDots"
       android:layout_alignParentBottom="true"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       app:tabBackground="@drawable/tab_selector"
       app:tabGravity="center"
       app:tabIndicatorHeight="0dp"/>
</RelativeLayout>

Подключите неактивные или фрагментированные элементы пользовательского интерфейса следующим образом:

Код Java:

mImageViewPager = (ViewPager) findViewById(R.id.pager);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabDots);
tabLayout.setupWithViewPager(mImageViewPager, true);

Вот и все, вы готовы идти.

Вам нужно будет создать следующий файл ресурсов xml в папке drawable.

tab_indicator_selected.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
    android:innerRadius="0dp"
    android:shape="ring"
    android:thickness="4dp"
    android:useLevel="false"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/colorAccent"/>
</shape>

tab_indicator_default.xml

<?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:innerRadius="0dp"
            android:shape="oval"
            android:thickness="2dp"
            android:useLevel="false">
            <solid android:color="@android:color/darker_gray"/>
    </shape>

tab_selector.xml

 <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/tab_indicator_selected"
          android:state_selected="true"/>

    <item android:drawable="@drawable/tab_indicator_default"/>
</selector>

Чувствуете себя таким же ленивым, как я? Что ж, весь приведенный выше код конвертируется в библиотеку! Использование Добавьте следующее в свой gradle: implementation 'com.chabbal:slidingdotsplash:1.0.2' Добавьте следующее в свой макет Activity или Fragment.

<com.chabbal.slidingdotsplash.SlidingSplashView
        android:id="@+id/splash"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:imageResources="@array/img_id_arr"/>

Создайте целочисленный массив в strings.xml, например.

<integer-array name="img_id_arr">
   <item>@drawable/img1</item>
   <item>@drawable/img2</item>
   <item>@drawable/img3</item>
   <item>@drawable/img4</item>
</integer-array>

Готово! Дополнительно, чтобы прослушать изменения страницы, используйте addOnPageChangeListener(listener); Github ссылку .

person Junaid    schedule 14.10.2016
comment
Распространяет ли это точки по всей ширине родителя? Вы бы хотели, чтобы точки были на расстоянии 10-20 dp друг от друга для индикатора страницы. - person androidguy; 23.11.2016
comment
он помещает точки в центр родительской ширины .... и да, между точками также есть соответствующий интервал ... проголосуйте за, если это помогло вам .. - person Junaid; 23.11.2016
comment
Это решение, как и большинство других, добавляет ViewGroup и дополнительное представление для каждой страницы, что является ненужной тратой времени для рисования нескольких кругов. Я использовал библиотеку Джейка Уортона, но добавил непосредственно его код, чтобы исправить некоторые небольшие проблемы. - person androidguy; 03.12.2016
comment
Может быть, я что-то упустил, но массив, идущий в файл строк, не может найти @Drawable/img 1-4. Они здесь не упоминаются. Что мне не хватает??? - person Eric Engel; 07.02.2017
comment
привет вам нужно создать свой собственный массив в strings.xml. и добавьте эти изображения, упомянутые в массиве, в папку с возможностью рисования... кстати, "d" вашего @Drawable/img - это Capital, сделайте его маленьким... - person Junaid; 07.02.2017
comment
Спасибо за решение, все работает! но как определить, в какой позиции мы находимся? Мне нужно знать, в какой позиции пейджера мы находимся, чтобы я мог обновить другие представления. Я попробовал setOnShowImageListener и попытался работать с этим обратным вызовом, но он не вызывается. Вы могли бы посоветовать ? - person Mohamed Hamdaoui; 07.02.2017
comment
я обновил версию библиотеки изменения ответов в gradle и использую onPageChangeListener... - person Junaid; 07.02.2017
comment
Я уже проголосовал, прежде чем задать вопрос, потому что это уже очень мне помогло, но теперь я хотел бы поставить +2 или +100 :), потому что добавление onPageChangeListener отлично сработало для меня! И просто чтобы было понятно всем, кто может это использовать, вам нужно выполнять обновления только для обратного вызова onPageSelected, добавление обновления в обратный вызов onPageScrolled делает его беспорядочным, оно запускает обновление, как только вы начинаете прокручивать, что не визуально хорошо! - person Mohamed Hamdaoui; 08.02.2017
comment
Зачем нам нужен TabLayout? - person winklerrr; 13.06.2017
comment
Вы можете просто использовать shape в качестве корневого элемента для рисунков индикатора. Нет необходимости оборачивать их как отдельные элементы в файл layer-list. - person cascal; 19.06.2017
comment
Кто-нибудь может мне помочь? Я использовал библиотеку, и скользящая точка видна, но всякий раз, когда я сдвигаю изображение, она не перемещает скользящую точку. Другими словами, если я сдвину изображение из угла, оно сдвинет изображение, но не скользящую точку, а если я сдвину из середины, оно сдвинет точки, но не изображение. У меня есть изображения в моем фрагменте и пейджере в activity_main.xml. Будем признательны за любую помощь и руководство. Спасибо :). @Джуни - person makkhay gurung; 14.07.2017
comment
пожалуйста, опубликуйте свой вопрос с вашим кодом в репозитории github, чтобы я мог его изучить. - person Junaid; 18.07.2017
comment
Хорошее решение, которое отлично работает. Однако это не сработает, если вы переопределите GetPageTitleFormatted, так как в итоге вы получите вкладки с заголовками и точками. - person Elisabeth; 31.07.2017
comment
как уменьшить расстояние между точками? - person Gak2; 18.08.2017
comment
@Juni как я покажу левую страницу, среднюю страницу, следующую страницу, используя тот же пример с точками, указывающими на страницу 1 - person Erum; 25.08.2017
comment
Работает отлично Xamarin.Android. отличный ответ. - person Mehdi Dehghani; 28.09.2017
comment
Можно ли изменить цвет точек? как белые точки заливки, когда они выбраны, и не заполняются, когда они не выбраны? - person Angad; 27.01.2018
comment
да, измените соответствующий индикатор drawable.xml на свои нужды, тогда он должен работать - person Junaid; 28.01.2018
comment
Для просмотра переработчика? индикатор страницы? - person blackHawk; 13.05.2018
comment
Вы хотите использовать com.google.android.material.tabs.TabLayout в новых версиях - person schlenger; 07.03.2019
comment
Обновление: это работает, но вы должны использовать новые компоненты: androidx.viewpager.widget.ViewPager и com.google.android.material.tabs.TabLayout. - person dreinoso; 25.09.2019
comment
точки не скользят вместе со страницей. Я использую скользящую заставку - person landrykapela; 25.01.2020
comment
Приведенный выше XML-код с возможностью рисования выглядит странно, пока я не изменил форму на ring. Кажется, кольцо также используется в библиотеке slidedotsplash вместо овала. - person katie; 01.05.2020
comment
@katie Изначально это было кольцо, но кто-то изменил его на овальное. (И, возможно, я одобрил правку, не читая ее). Спасибо за указание - person Junaid; 08.09.2020
comment
Как можно анимировать точки при прокрутке страниц? - person M. Afrashteh; 07.03.2021
comment
@M.Afrashteh Вы можете добавить свой собственный код в onPageScrolled для перемещения точек ... или, если вы не хотите делать это самостоятельно, используйте библиотеку, которая делает это - person Junaid; 09.03.2021

Мое самодельное решение:

В макете:

<LinearLayout
        android:orientation="horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/dots"
        />

И в деятельности

private final static int NUM_PAGES = 5;
private ViewPager mViewPager;
private List<ImageView> dots;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...
    addDots();
}

public void addDots() {
    dots = new ArrayList<>();
    LinearLayout dotsLayout = (LinearLayout)findViewById(R.id.dots);

    for(int i = 0; i < NUM_PAGES; i++) {
        ImageView dot = new ImageView(this);
        dot.setImageDrawable(getResources().getDrawable(R.drawable.pager_dot_not_selected));

        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT
        );
        dotsLayout.addView(dot, params);

        dots.add(dot);
    }

    mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }

        @Override
        public void onPageSelected(int position) {
            selectDot(position);
        }

        @Override
        public void onPageScrollStateChanged(int state) {
        }
    });
}

public void selectDot(int idx) {
    Resources res = getResources();
    for(int i = 0; i < NUM_PAGES; i++) {
        int drawableId = (i==idx)?(R.drawable.pager_dot_selected):(R.drawable.pager_dot_not_selected);
        Drawable drawable = res.getDrawable(drawableId);
        dots.get(i).setImageDrawable(drawable);
    }
}
person Marin Shalamanov    schedule 01.05.2015
comment
Зачем использовать тяжелый компонент Layout только для того, чтобы поставить точку? Вместо этого используйте View. - person Apurva; 17.08.2015
comment
Я думаю, что линейная компоновка такова, что она будет центрировать и группировать точки. - person ShawnV; 07.09.2015

Я создал библиотеку, чтобы удовлетворить потребность в индикаторе страницы в ViewPager. Моя библиотека содержит представление под названием DotIndicator. Чтобы использовать мою библиотеку, добавьте compile 'com.matthew-tamlin:sliding-intro-screen:3.2.0' в файл сборки Gradle.

Представление можно добавить в макет, добавив следующее:

    <com.matthewtamlin.sliding_intro_screen_library.indicators.DotIndicator
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:numberOfDots=YOUR_INT_HERE
            app:selectedDotIndex=YOUR_INT_HERE/>

Приведенный выше код идеально воспроизводит функциональность точек на главном экране Google Launcher, однако, если вы хотите дополнительно настроить его, можно добавить следующие атрибуты:

  • app:unselectedDotDiameter и app:selectedDotDiameter для установки диаметров точек
  • app:unselectedDotColor и app:selectedDotColor для установки цвета точек
  • app:spacingBetweenDots для изменения расстояния между точками
  • app:dotTransitionDuration для установки времени анимации перехода от малого к большому (и обратно)

Кроме того, представление можно создать программно, используя:

DotIndicator indicator = new DotIndicator(context);

Существуют методы изменения свойств, аналогичные атрибутам. Чтобы обновить индикатор, чтобы он отображал другую страницу как выбранную, просто вызовите метод indicator.setSelectedItem(int, true) изнутри ViewPager.OnPageChangeListener.onPageSelected(int).

Вот пример его использования:

введите здесь описание изображения

Если вам интересно, библиотека на самом деле была разработана для создания вводных экранов, подобных показанному на приведенном выше gif-файле.

Исходный код Github доступен здесь: https://github.com/MatthewTamlin/SlidingIntroScreen.

person Helios    schedule 29.02.2016
comment
Получил ошибку в индикаторе.setSelectedItem(position, true); Индексаутофбаундсексцептион - person Dixit Panchal; 09.06.2016
comment
Какая версия? Я думал, что исправил это в 3.0.1, а также какие у вас были значения для Indicator.size() и position? - person Helios; 10.06.2016
comment
Отличная библиотека! Однако существует ли более элегантный способ одновременного обновления selectedItem и numberOfItems? В зависимости от того, какой из них больше, порядок меняется, иначе вы выдаете исключение IndexOutOfBounds. См. эту суть. - person vsp; 07.07.2016
comment
@vsp DotIndicator реализует интерфейс SelectionIndicator, что означает наличие двух полезных методов, которые могут решить вашу проблему: int getNumberOfItems() и void setNumberOfItems(). Вместо того, чтобы перехватывать исключение, вы можете сделать что-то вроде этого gist.github.com/MatthewTamlin/761c7338d271af29526edc7859480aef. - person Helios; 08.07.2016
comment
Для тех, кто не следит за сутью разговора, на самом деле была ошибка, которая теперь исправлена. 3.0.2 — последняя версия на данный момент. - person Helios; 11.07.2016
comment
Как использовать класс DotIndicator в Activity? он говорит, что не может разрешить символ DotIndicator - person kashlo; 27.09.2016
comment
@zakusha звучит так, будто это, вероятно, ошибка IDE, вы пробовали очистить и перестроить проект? У меня были проблемы с Android Studio, просто я не находил классы, которые раньше определенно находились в зависимостях. В худшем случае попробуйте аннулировать кеш и повторно загрузить все зависимости. Тем не менее, я проверю, что с библиотекой все в порядке, и вернусь к вам. - person Helios; 28.09.2016
comment
Есть ли документация по использованию этой библиотеки? - person Angad; 27.01.2018
comment
в моих точках переход не происходит - person abh22ishek; 01.02.2019

ViewPagerIndicator не обновлялся с 2012 года и содержит несколько ошибок, которые так и не были исправлены.

Наконец-то я нашел альтернативу этой световой библиотеке, которая отображает красивые точки для viewpager, вот ссылка:

https://github.com/ongakuer/CircleIndicator

Легко реализовать!

person Yoann Hercouet    schedule 25.08.2016
comment
Какие ошибки вы знаете? Можете ли вы предоставить некоторые источники? - person Michał Jabłoński; 18.09.2020
comment
Оба они имеют форму кольца в формате xml. но я вижу прямоугольные коробки как разделитель. приложение:ci_drawable=. Приложение @drawable/selected_dot:ci_drawable_unselected=. @drawable/default_dot - person Vikas Pandey; 14.10.2020
comment
легко внедрить, но в выбранном случае он показывает прямоугольную рамку, хотя я установил только xmls circuler. - person Vikas Pandey; 15.10.2020

Я подумал о том, чтобы опубликовать более простое решение для вышеуказанной проблемы, и номера индикаторов можно динамически изменять, изменяя только одно значение переменной dotCounts=x, что я сделал, происходит следующим образом.

  1. Создайте XML-файл в папке с возможностью рисования для выбранного индикатора страницы с именем item_selected.
    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="oval" android:useLevel="true"
        android:dither="true">
        <size android:height="8dp" android:width="8dp"/>
        <solid android:color="@color/image_item_selected_for_dots"/>
    </shape>
  1. Создайте еще один XML-файл для невыбранного индикатора с именем item_unselected.
    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="oval" android:useLevel="true"
        android:dither="true">
        <size android:height="8dp" android:width="8dp"/>
        <solid android:color="@color/image_item_unselected_for_dots"/>
    </shape>
  1. Теперь добавьте эту часть кода в то место, где вы хотите отображать индикаторы, например, ниже viewPager в XML-файле макета.
    <RelativeLayout
        android:id="@+id/viewPagerIndicator"
        android:layout_width="match_parent"
        android:layout_below="@+id/banner_pager"
        android:layout_height="wrap_content"
        android:gravity="center">
    
        <LinearLayout
            android:id="@+id/viewPagerCountDots"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_centerHorizontal="true"
            android:gravity="center"
            android:orientation="horizontal" />

    </RelativeLayout>
  1. Добавьте эту функцию поверх вашего файла активности, где ваш макет завышен или указанный выше xml-файл связан с
    private int dotsCount = 5;    //No of tabs or images
    private ImageView[] dots;
    LinearLayout linearLayout;
    
    private void drawPageSelectionIndicators(int mPosition){
        if(linearLayout!=null) {
            linearLayout.removeAllViews();
        }
        linearLayout=(LinearLayout)findViewById(R.id.viewPagerCountDots);
        dots = new ImageView[dotsCount];
        for (int i = 0; i < dotsCount; i++) {
            dots[i] = new ImageView(context);
            if(i==mPosition)
                dots[i].setImageDrawable(getResources().getDrawable(R.drawable.item_selected));
            else
                dots[i].setImageDrawable(getResources().getDrawable(R.drawable.item_unselected));
    
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.WRAP_CONTENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT
            );
    
            params.setMargins(4, 0, 4, 0);
            linearLayout.addView(dots[i], params);
        }
    }
  1. Наконец, в свой метод onCreate добавьте следующий код, чтобы ссылаться на ваш макет и обрабатывать выбранные позиции страницы.
    drawPageSelectionIndicators(0);
    mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }
    
        @Override
        public void onPageSelected(int position) {
            drawPageSelectionIndicators(position);
        }
    
        @Override
        public void onPageScrollStateChanged(int state) {
        }
    });
person Lokanath    schedule 21.03.2016

Вы можете попробовать библиотеку Джейка Уортона — https://github.com/JakeWharton/Android-ViewPagerIndicator.

person Joel Fernandes    schedule 14.12.2013
comment
Как добавить точки, а не вкладки (как в программе запуска Nexus 5)? - person Kfir Guy; 14.12.2013
comment
@KfirGuy Их называют индикаторами. Вы можете сделать это, используя библиотеку, о которой я упоминал выше. Кроме того, вы можете увидеть его в действии здесь - play.google. ком/магазин/приложения/ - person Joel Fernandes; 14.12.2013
comment
@JoelFernandes похоже, что это приложение доступно не во всех странах. - person 34m0; 16.02.2016

Ниже приводится мое предлагаемое решение.

  • Since we need to show only some images in the view pagers so have avoided the cumbersome use of fragments.
    • Implemented the view page indicators (the bottom dots without any extra library or plugin)
    • При касании индикаторов страницы просмотра (точки) также происходит навигация по страницам.
    • Пожалуйста, не забудьте добавить свои собственные изображения в ресурсы.
    • Не стесняйтесь комментировать и улучшать его.

A) Ниже приведен мой файл activity_main.xml.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="schneider.carouseladventure.MainActivity">

    <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/viewpager"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <RelativeLayout
        android:id="@+id/viewPagerIndicator"
        android:layout_width="match_parent"
        android:layout_height="55dp"
        android:layout_alignParentBottom="true"
        android:layout_marginTop="5dp"
        android:gravity="center">

        <LinearLayout
            android:id="@+id/viewPagerCountDots"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_centerHorizontal="true"
            android:gravity="center"
            android:orientation="horizontal" />

    </RelativeLayout>


</RelativeLayout>

Б) pager_item.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">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/imageView" />
</LinearLayout>

В) MainActivity.java

import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener, View.OnClickListener {

    int[] mResources = {R.drawable.nature1, R.drawable.nature2, R.drawable.nature3, R.drawable.nature4,
            R.drawable.nature5, R.drawable.nature6
    };

    ViewPager mViewPager;
    private CustomPagerAdapter mAdapter;
    private LinearLayout pager_indicator;
    private int dotsCount;
    private ImageView[] dots;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mViewPager = (ViewPager) findViewById(R.id.viewpager);
        pager_indicator = (LinearLayout) findViewById(R.id.viewPagerCountDots);
        mAdapter = new CustomPagerAdapter(this, mResources);
        mViewPager.setAdapter(mAdapter);
        mViewPager.setCurrentItem(0);
        mViewPager.setOnPageChangeListener(this);

        setPageViewIndicator();

    }

    private void setPageViewIndicator() {

        Log.d("###setPageViewIndicator", " : called");
        dotsCount = mAdapter.getCount();
        dots = new ImageView[dotsCount];

        for (int i = 0; i < dotsCount; i++) {
            dots[i] = new ImageView(this);
            dots[i].setImageDrawable(getResources().getDrawable(R.drawable.nonselecteditem_dot));

            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.WRAP_CONTENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT
            );

            params.setMargins(4, 0, 4, 0);

            final int presentPosition = i;
            dots[presentPosition].setOnTouchListener(new View.OnTouchListener() {

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    mViewPager.setCurrentItem(presentPosition);
                    return true;
                }

            });


            pager_indicator.addView(dots[i], params);
        }

        dots[0].setImageDrawable(getResources().getDrawable(R.drawable.selecteditem_dot));
    }

    @Override
    public void onClick(View v) {

    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {

        Log.d("###onPageSelected, pos ", String.valueOf(position));
        for (int i = 0; i < dotsCount; i++) {
            dots[i].setImageDrawable(getResources().getDrawable(R.drawable.nonselecteditem_dot));
        }

        dots[position].setImageDrawable(getResources().getDrawable(R.drawable.selecteditem_dot));

        if (position + 1 == dotsCount) {

        } else {

        }
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
}

Г) CustomPagerAdapter.java

 import android.content.Context;
    import android.support.v4.view.PagerAdapter;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    import android.widget.LinearLayout;

    public class CustomPagerAdapter extends PagerAdapter {
        private Context mContext;
        LayoutInflater mLayoutInflater;
        private int[] mResources;

        public CustomPagerAdapter(Context context, int[] resources) {
            mContext = context;
            mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            mResources = resources;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {

            View itemView = mLayoutInflater.inflate(R.layout.pager_item,container,false);
            ImageView imageView = (ImageView) itemView.findViewById(R.id.imageView);
            imageView.setImageResource(mResources[position]);
           /* LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(950, 950);
            imageView.setLayoutParams(layoutParams);*/
            container.addView(itemView);
            return itemView;
        }

        @Override
        public void destroyItem(ViewGroup collection, int position, Object view) {
            collection.removeView((View) view);
        }

        @Override
        public int getCount() {
            return mResources.length;
        }

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

Д) selecteditem_dot.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" android:useLevel="true"
    android:dither="true">

    <size android:height="12dip" android:width="12dip"/>

    <solid android:color="#7e7e7e"/>
</shape>

F) nonselecteditem_dot.xml

 <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="oval" android:useLevel="true"
        android:dither="true">        
        <size android:height="12dip" android:width="12dip"/>        
        <solid android:color="#d3d3d3"/>
    </shape>

первое изображение

введите описание изображения здесь

person Ajit    schedule 04.08.2016
comment
я использовал это, но точки прокрутки viewpager не меняются - person Aditya Vyas-Lakhan; 10.10.2017
comment
это лучший ответ. - person Sandeep Londhe; 21.11.2018

Если кто-то хочет создать viewPager с миниатюрами в качестве индикаторов, можно использовать эту библиотеку: ThumbIndicator для viewPager, который также работает со ссылками на изображения в качестве ресурсов.

person Mahdi Moqadasi    schedule 04.03.2019

Вот как я это сделал, несколько похоже на решения выше. Просто убедитесь, что вы вызываете метод loadDots() после загрузки всех изображений.

    private int dotsCount;
    private TextView dotsTextView[];

    private void setupAdapter() {
        adapter = new SomeAdapter(getContext(), images);
        viewPager.setAdapter(adapter);
        viewPager.setCurrentItem(0);
        viewPager.addOnPageChangeListener(viewPagerPageChangeListener);
    }

    private final ViewPager.OnPageChangeListener viewPagerPageChangeListener = new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

        @Override
        public void onPageSelected(int position) {
            for (int i = 0; i < dotsCount; i++)
                dotsTextView[i].setTextColor(Color.GRAY);

            dotsTextView[position].setTextColor(Color.WHITE);
        }

        @Override
        public void onPageScrollStateChanged(int state) {}
    };

    protected void loadDots() {
        dotsCount = adapter.getCount();
        dotsTextView = new TextView[dotsCount];
        for (int i = 0; i < dotsCount; i++) {
            dotsTextView[i] = new TextView(getContext());
            dotsTextView[i].setText(R.string.dot);
            dotsTextView[i].setTextSize(45);
            dotsTextView[i].setTypeface(null, Typeface.BOLD);
            dotsTextView[i].setTextColor(android.graphics.Color.GRAY);
            mDotsLayout.addView(dotsTextView[i]);
        }
        dotsTextView[0].setTextColor(Color.WHITE);
    }

XML

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="180dp"
        android:background="#00000000"/>


    <ImageView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/introImageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <LinearLayout
        android:id="@+id/image_count"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#00000000"
        android:gravity="center|bottom"
        android:orientation="horizontal"/>
</FrameLayout>
person r3dm4n    schedule 24.03.2018

person    schedule
comment
setOnPageChangedListener() устарело!! Используйте addOnPageChangedListener() сейчас. - person Apurva; 04.08.2015
comment
Это не очень хорошее решение, так как вы должны точно знать, сколько страниц вы будете использовать. Как только вы добавляете или удаляете страницу, у вас возникают проблемы. - person 0xMatthewGroves; 27.07.2016
comment
Не боритесь с рамками. В Android есть такие инструменты, как TabLayout, поэтому нет смысла изобретать велосипед. - person kike; 03.04.2018
comment
Упростите это: private void setDotSelection(int index) { dot1.setImageResource(index == 0 ? R.drawable.circle_selected: R.drawable.circle); dot2.setImageResource (индекс == 1? R.drawable.circle_selected: R.drawable.circle); dot3.setImageResource(index == 2 ? R.drawable.circle_selected: R.drawable.circle); dot4.setImageResource(index == 3 ? R.drawable.circle_selected: R.drawable.circle); dot5.setImageResource (индекс == 4? R.drawable.circle_selected: R.drawable.circle); } - person Duna; 05.04.2018