2012-01-12 4 views
40

Есть ли возможность отображать две страницы одновременно при использовании ViewPager? Я не ищу краевой эффект, а скорее для двух полных страниц в то же время.Несколько страниц одновременно на ViewPager

Заранее спасибо.

+0

Я не совсем уверен, что вы asking..can вас объясните немного больше? – Cody

+0

Я хочу, чтобы ViewPager отображал две доступные страницы рядом, как книгу. –

+0

Вы могли бы использовать два фрагмента для достижения побочных эффектов страниц? его просто идея ... не обвиняйте меня ..... – NIPHIN

ответ

-2

Я не думаю, что это возможно с ограничениями на просмотр пейджера. Он позволяет пользователю одновременно просматривать страницы 1. Возможно, вы сможете что-то сделать с использованием фрагментов, а также иметь 2 фрагмента ViewPager рядом и использовать кнопки для разработки страницы, которую вы хотите реализовать, но код может стать очень сложным.

Вы можете попробовать что-то вроде ViewFlipper - где вы можете сделать намного больше настроек (включая анимацию).

Надеюсь, это поможет.

64

Просьба ознакомиться с методом getPageWidth в соответствующем PagerAdapter. Переопределите его и верните, например. 0.8f, чтобы все дочерние страницы охватывали только 80% ширины ViewPager.

Подробнее: http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html#getPageWidth(int)

+0

проблема с этой техникой заключается в том, что появляется дополнительное поле, добавляющее странное пустое пространство под Viewpager – elgui

+0

Я думаю, что это лучший ответ! –

+0

Это добавляет некоторый мерцающий эффект на пейджер представления, я все еще могу провести пальцем и видеть, что виды видят странное мерцание. – pyus13

5

См that blog entry.
Техника PagerContainer решена моя проблема.

EDIT:
я нашел такой же ответ.
How to migrate from Gallery to HorizontalScrollView & ViewPager?

+1

Добро пожаловать в StackOverflow! Вы хотите добавить отрывок из этой записи в свой ответ, чтобы он по-прежнему был полезен, если ссылка умирает? –

+0

@ S.L.Barth Спасибо за ваш совет. Я изменил свой ответ. – kaw

2

Вы можете решить эту проблему, используя getPageWidth в классе PagerAdapter.

Будьте уверены ли ваш JAR является уточненный .Since ранее ViewPager не было поддержки нескольких страниц одновременно.

общественный поплавок getPageWidth() {

возвращение 0.4f; (Вы можете выбрать его .Дль всего экрана на страницу, вы должны дать 1f) }

30

Смотрите мои более уточненный ответ здесь: Can ViewPager have multiple views in per page?

Я обнаружил, что возможно даже более простое решение, указав отрицательный запас для ViewPager. Я создал проект MultiViewPager на GitHub, который вы можете захотеть взглянуть на:

https://github.com/Pixplicity/MultiViewPager

Хотя этот вопрос конкретно просит решение без краевого эффекта, некоторые ответы здесь предлагают обходное решение 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 размерности.)

Мы реализовали этот in the Dutch newspaper app De Telegraaf Krant:

Phone example in De Telegraaf KrantTablet example

+0

Мне понравилось ваше решение. Простой и элегантный ...! Спасибо чувак. Я пытался достичь этого, используя 'PageTransformer'. –

+2

работал для меня.Вам также необходимо добавить setOffScreenPageLimit (2), чтобы улучшить кеширование до 2, чтобы избежать отставания во втором следующем представлении. – Giorgio

+0

В предыдущем примечании: это ViewPager.setOffscreenPageLimit (2), если кто-то отбрасывается. – fooser

11

Вы должны переопределить getPageWidth() метод на адаптер для просмотра. Пример:

@Override 
public float getPageWidth(int position) { 
    return 0.9f; 
} 

Пробуйте этот код в вашем адаптере, а затем вы поймете.

+2

Это очень похоже на ответ @ Markus-Wörz? – bummi

1

создать файл макета: 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> 

ViewPager примерно так же мал, как вы хотите, чтобы ваши страницы, чтобы быть. С андроидом: 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); 
     } 
}); 
0

Это может быть дон в Item Layout в ViewPager. Предположим, что вам нужно две страницы за раз.

Это Пункт Layout (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; 
} 
Смежные вопросы