Android ViewPager - просмотр предварительного просмотра страницы слева и справа
Я использую Android ViewPager
. То, что я хочу сделать, - показать предварительный просмотр страницы как слева, так и справа. Я видел, где я могу использовать отрицательный pageMargin
, чтобы показать предварительный просмотр правой части.
setPageMargin(-100);
В любом случае, я могу показать предварительный просмотр левой стороны? В основном это похоже на виджет галереи, который я ищу.
Ответы
Ответ 1
Чтобы показать предварительный просмотр левой и правой страниц, установите следующие два значения
-
viewpager.setClipToPadding(false);
-
viewpager.setPadding(left,0,right,0);
Если вам нужно пространство между двумя страницами в представлении, добавьте
viewpager.setPageMargin(int);
Ответ 2
Ответ от @JijuInduchoodan совершенен и работает. Однако, поскольку я относительно новичок в Android, мне потребовалось некоторое время, чтобы понять и установить его должным образом. Итак, я отправляю этот ответ для будущей справки и помогаю всем, кто в той же обуви, что и я.
if (viewPager == null)
{
// Initializing view pager
viewPager = (ViewPager) findViewById(R.id.vpLookBook);
// Disable clip to padding
viewPager.setClipToPadding(false);
// set padding manually, the more you set the padding the more you see of prev & next page
viewPager.setPadding(40, 0, 40, 0);
// sets a margin b/w individual pages to ensure that there is a gap b/w them
viewPager.setPageMargin(20);
}
Нет необходимости устанавливать ширину страницы ViewPager's
в адаптере. Нет дополнительного кода, необходимого для просмотра предыдущей и следующей страницы в ViewPager
. Однако, если вы хотите добавить пустое пространство вверху и внизу каждой страницы, вы можете установить следующий код в ViewPager's
родительский макет родительской страницы.
android:paddingTop="20dp"
android:paddingBottom="20dp"
![Final ViewPager]()
Это будет окончательный вид ViewPager.
Ответ 3
В 2017 году такое поведение также может быть легко достигнуто с помощью RecyclerView
с PagerSnapHelper (добавлено в версии 25.1.0 поддержки v7 библиотека):

![введите описание изображения здесь]()
Когда-то мне понадобилась такая функция, подобная viewpager, и подготовила крошечную библиотеку:
MetalRecyclerPagerView - вы можете найти весь код вместе с примерами.
В основном он состоит из одного файла класса: MetalRecyclerViewPager.java (и два xmls: attrs.xml и ids.xml).
Надеюсь, что это поможет кому-то и сэкономит несколько часов:)
Ответ 4
если кто-то все еще ищет решение, я настроил ViewPage для его достижения без использования отрицательного поля, найдите образец проекта здесь https://github.com/44kksharma/Android-ViewPager-Carousel-UI, в большинстве случаев он должен работать, но вы все еще можно определить поле страницы с помощью mPager.setPageMargin(margin in pixel);
![made at imgflip.com 2557e5.gif]()
Ответ 5
Вы можете сделать это в файле XML, просто используйте следующий код:
android:clipToPadding="false"
android:paddingLeft="XX"
android:paddingRight="XX"
Например:
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:paddingLeft="30dp"
android:paddingRight="30dp" />
Примечание: если вам нужно пространство между страницами, установите отступы/поля для дочерних фрагментов
Ответ 6
Решение с новым ViewPager2
В настоящее время вы должны рассмотреть возможность использования ViewPager2, который "заменяет ViewPager, решая большинство проблем его предшественников":
-
Основано на RecyclerView
- Поддерживает макет справа налево (RTL)
- Позволяет вертикальный пейджинг
- Улучшенные уведомления об изменении набора данных
- Поддерживает изменяемые коллекции фрагментов
Результат
![enter image description here]()
Код
В своей деятельности/фрагменте настройте ViewPager2:
// MyRecyclerViewAdapter is an standard RecyclerView.Adapter :)
viewPager2.adapter = MyRecyclerViewAdapter()
// You need to retain one page on each side so that the next and previous items are visible
viewPager2.offscreenPageLimit = 1
// Add a PageTransformer that translates the next and previous items horizontally
// towards the center of the screen, which makes them visible
val nextItemVisiblePx = resources.getDimension(R.dimen.viewpager_next_item_visible)
val currentItemHorizontalMarginPx = resources.getDimension(R.dimen.viewpager_current_item_horizontal_margin)
val pageTranslationX = nextItemVisiblePx + currentItemHorizontalMarginPx
val pageTransformer = ViewPager2.PageTransformer { page: View, position: Float ->
page.translationX = -pageTranslationX * position
// Next line scales the item height. You can remove it if you don't want this effect
page.scaleY = 1 - (0.25f * abs(position))
// If you want a fading effect uncomment the next line:
// page.alpha = 0.25f + (1 - abs(position))
}
viewPager2.setPageTransformer(pageTransformer)
// The ItemDecoration gives the current (centered) item horizontal margin so that
// it does not occupy the whole screen width. Without it the items overlap
val itemDecoration = HorizontalMarginItemDecoration(
context,
R.dimen.viewpager_current_item_horizontal_margin
)
viewPager2.addItemDecoration(itemDecoration)
Добавьте HorizontalMarginItemDecoration
, который является тривиальным ItemDecoration
:
/**
* Adds margin to the left and right sides of the RecyclerView item.
* Adapted from https://stackoverflow.com/a/27664023/4034572
* @param horizontalMarginInDp the margin resource, in dp.
*/
class HorizontalMarginItemDecoration(context: Context, @DimenRes horizontalMarginInDp: Int) :
RecyclerView.ItemDecoration() {
private val horizontalMarginInPx: Int =
context.resources.getDimension(horizontalMarginInDp).toInt()
override fun getItemOffsets(
outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State
) {
outRect.right = horizontalMarginInPx
outRect.left = horizontalMarginInPx
}
}
Добавьте размеры, определяющие степень видимости предыдущего/следующего элемента, и горизонтальное поле текущего элемента:
<dimen name="viewpager_next_item_visible">26dp</dimen>
<dimen name="viewpager_current_item_horizontal_margin">42dp</dimen>
![enter image description here]()
Наконец добавьте ViewPager2
в свой макет:
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
Одна важная вещь: элемент ViewPager2
должен иметь layout_height="match_parent"
(в противном случае он генерирует исключение IllegalStateException), поэтому вы должны сделать что-то вроде:
<androidx.cardview.widget.CardView 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="match_parent" <-- this!
app:cardCornerRadius="8dp"
app:cardUseCompatPadding="true">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="280dp">
<!-- ... -->
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
О новом ViewPager2
Ответ 7
Для тех, кто пытается получить это на разных экранах,
mPager.setClipToPadding(false);
DisplayMetrics displayMetrics = new DisplayMetrics();
self.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int width = displayMetrics.widthPixels;
int paddingToSet = width/4; //set this ratio according to how much of the next and previos screen you want to show.
mPager.setPadding(paddingToSet,0,paddingToSet,0);
Ответ 8
Обратите внимание, что при установке нулевого отступа для viewpager размещение краевого эффекта viewpager испортилось, это ошибка viewpager, смотрите здесь: ошибка edgepffect viewpager
Вы можете либо отключить эффект края, установив android:overScrollMode="never"
в пейджер, либо исправить ошибку с помощью слегка измененной версии класса EdgeEffect: ViewPagerEdgeEffect fix
Ответ 9
Используйте этот ассемблер и класс для просмотра viewpager в левом и правом scroll.add необходимых классах для прокрутки для просмотра следующих страниц.
package com.rmn.viewpager;
import java.util.List;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
/**
* The <code>PagerAdapter</code> serves the fragments when paging.
* @author mwho
*/
public class PagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments;
/**
* @param fm
* @param fragments
*/
public PagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
/* (non-Javadoc)
* @see android.support.v4.app.FragmentPagerAdapter#getItem(int)
*/
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
/* (non-Javadoc)
* @see android.support.v4.view.PagerAdapter#getCount()
*/
@Override
public int getCount() {
return this.fragments.size();
}
}
package com.manishkpr.viewpager;
import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
public class ViewPagerAdapter extends FragmentPagerAdapter {
private Context _context;
public ViewPagerAdapter(Context context, FragmentManager fm) {
super(fm);
_context=context;
}
@Override
public Fragment getItem(int position) {
Fragment f = new Fragment();
switch(position){
case 0:
f=LayoutOne.newInstance(_context);
break;
case 1:
f=LayoutTwo.newInstance(_context);
break;
}
return f;
}
@Override
public int getCount() {
return 2;
}
}