Есть ли возможность отображать две страницы одновременно при использовании ViewPager
? Я не ищу краевой эффект, а скорее для двух полных страниц одновременно.
Спасибо заранее.
Есть ли возможность отображать две страницы одновременно при использовании ViewPager
? Я не ищу краевой эффект, а скорее для двух полных страниц одновременно.
Спасибо заранее.
Обратитесь к методу getPageWidth
в соответствующем PagerAdapter
. Переопределите его и верните, например. 0.8f
, чтобы все дочерние страницы охватывали только 80% ширины ViewPager.
Дополнительная информация: http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html#getPageWidth(int)
См. мой более свежий ответ здесь: Может ли ViewPager иметь несколько просмотров на странице?
Я обнаружил, что возможно даже более простое решение, указав отрицательный запас для ViewPager. Я создал проект MultiViewPager на GitHub, который вы можете посмотреть на:
Хотя этот вопрос специально требует решения без эффекта края, некоторые ответы здесь предлагают обходное решение CommonsWare, такое как предложение kaw.
Существуют различные проблемы с сенсорным управлением и аппаратным ускорением с этим конкретным решением. Более простым и более элегантным решением, на мой взгляд, является указание отрицательного поля для ViewPager:
ViewPager.setPageMargin(
getResources().getDimensionPixelOffset(R.dimen.viewpager_margin));
Затем я указал это измерение в моем dimens.xml
:
<dimen name="viewpager_margin">-64dp</dimen>
Чтобы компенсировать перекрывающиеся страницы, каждый просмотр содержимого страницы имеет противоположный край:
android:layout_marginLeft="@dimen/viewpager_margin_fix"
android:layout_marginRight="@dimen/viewpager_margin_fix"
Опять в dimens.xml
:
<dimen name="viewpager_margin_fix">32dp</dimen>
(Обратите внимание, что размер viewpager_margin_fix
равен половине размера абсолютного viewpager_margin
.)
Мы применили этот в приложении для голландской газеты De Telegraaf Krant:
Вы должны переопределить метод getPageWidth()
в адаптере viewpager. Например:
@Override
public float getPageWidth(int position) {
return 0.9f;
}
Попробуйте этот код в вашем адаптере, а затем вы поймете.
Смотрите эту запись в блоге. Техника PagerContainer решает мою проблему.
EDIT:
Я нашел тот же ответ.
Как перенести из галереи в HorizontalScrollView и ViewPager?
Вы можете решить эту проблему, используя getPageWidth в классе PagerAdapter.
Убедитесь, что ваш JAR обновлен. Поскольку ранее ViewPager не поддерживал несколько страниц одновременно.
public float getPageWidth() {
return 0.4f; (Вы можете выбрать его. Для полного экрана на странице вы должны дать 1f) }
создайте файл макета: my_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<FrameLayout
android:id="@+id/pager_container"
android:layout_width="match_parent"
android:layout_height="240dp"
android:clipChildren="false">
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="200dp"
android:clipToPadding="false"
android:layout_height="200dp"
android:layout_marginLeft="70dp"
android:layout_marginRight="70dp"
android:layout_gravity="center" />
</FrameLayout>
</layout>
просмотрщик примерно такой же маленький, как вы хотите, чтобы ваши страницы были. С андроидом: clipToPadding = "false" также отображаются страницы за пределами пейджера. Но теперь перетаскивание за пределы viewpager не имеет эффекта. Это можно устранить, выбирая штрихи из контейнера пейджера и передавая их на пейджер:
MyLayoutBinding binding = DataBindingUtil.<MyLayoutBinding>inflate(layoutInflater, R.layout.my_layout, parent, false)
binding.pager.setOffscreenPageLimit(3);
binding.pager.setPageMargin(15);
binding.pagerContainer.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return chatCollectionLayoutBinding.pager.onTouchEvent(event);
}
});
Это может быть указано в Макет элемента для Viewpager. Предположим, что вам нужны две страницы за раз.
Это Макет элемента (photo_slider_item.xml):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/photosSliderItem">
<ImageView android:id="@id/photoBox1" style="@style/photoBox"/>
<ImageView android:id="@id/photoBox2" style="@style/photoBox"/>
</LinearLayout>
И в вашем PagerAdapter:
@Override
public View instantiateItem(ViewGroup container, int position){
View sliderItem = LayoutInflater.from(container.getContext()).inflate(photo_slider_item, container, false);
ImageView photoBox1 = (ImageView) sliderItem.findViewById(R.id.photoBox1);
ImageView photoBox2 = (ImageView) sliderItem.findViewById(R.id.photoBox2);
photoBox1.setImageResource(photosIds[position]);
if(position < photosIds.length-1){
photoBox2.setImageResource(photosIds[position+1]);
} else {photoBox2.setImageResource(photosIds[0]);}
container.addView(sliderItem);
return sliderItem;
}
Я не думаю, что это возможно с ограничениями View Pager. Он позволяет пользователю одновременно просматривать страницы 1. Возможно, вы сможете что-то сделать с использованием фрагментов, а также иметь 2 фрагмента ViewPager рядом и использовать кнопки для выверки страницы, которую вы хотите реализовать, но код может стать очень сложным.
Вы можете попробовать что-то вроде ViewFlipper - где вы можете сделать намного больше настроек (включая анимацию).
Надеюсь, это поможет.