在ViewPager上同时多个页面
使用ViewPager
时,是否有可能同时显示两页? 我不是在寻找一个边缘效应,而是在同一时间两个完整的页面。
提前致谢。
请查看相应的PagerAdapter
中的getPageWidth
方法。 覆盖它并返回例如0.8f
,使所有的子页面只占用ViewPager宽度的80%。
更多信息: http : //developer.android.com/reference/android/support/v4/view/PagerAdapter.html#getPageWidth(int)
查看我的更新的答案在这里: ViewPager可以在每个页面有多个视图?
通过为ViewPager指定负边距,我发现了一个更简单的解决scheme。 我已经在GitHub上创build了MultiViewPager项目,你可能想看看:
虽然这个问题特别要求没有边缘效应的解决scheme,但是这里的一些答案提出了CommonsWare的解决方法,比如kaw的build议。
使用特定的解决scheme,触摸处理和硬件加速存在各种问题。 在我看来,更简单和更优雅的解决scheme是为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中实现了这个function :
您必须重写viewpager的Adapter上的getPageWidth()
方法。 例如:
@Override public float getPageWidth(int position) { return 0.9f; }
尝试在你的适配器的代码,然后你会明白。
看到这个博客条目 。
PagerContainer技术解决了我的问题。
编辑:
我find了同样的答案。
如何从Gallery迁移到HorizontalScrollView&ViewPager?
您可以通过在PagerAdapter类中使用getPageWidth来解决此问题。
确保你的JAR是否是最新的 。由于以前的ViewPager不支持同时多个页面。
public float getPageWidth(){
返回0.4f;(你可以select它。对于每页的全屏,你应该给1f)}
创build你的布局文件: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就像你想要的页面一样小。 使用android:clipToPadding =“false”时,页面外部的页面也可见。 但现在拖到viewpager外面没有任何效果这可以通过从pager-container中select触摸并将它们传递给传呼机来弥补:
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; }
我不认为这是可能的视图寻呼机的限制。 它只允许用户一次查看第1页。 你也许可以通过使用片段来解决问题,并且使用两个ViewPager片段并使用button来找出想要实现的页面,但是代码可能会变得非常复杂。
你可以尝试一些像ViewFlipper – 你可以做更多的定制(包括animation)。
希望这可以帮助。