当使用 ViewPager
时,是否有可能同时显示两个页面?我不是在寻找边缘效果,而是想要同时显示两个完整的页面。
当使用 ViewPager
时,是否有可能同时显示两个页面?我不是在寻找边缘效果,而是想要同时显示两个完整的页面。
PagerAdapter
中的getPageWidth
方法。覆盖它并返回例如0.8f
,以使所有子页面仅占ViewPager宽度的80%。请查看我的更新回答:ViewPager每页可以有多个视图吗?
我发现一种更简单的解决方案,即通过为ViewPager指定负边距。我在GitHub上创建了MultiViewPager项目,您可能想要查看:
虽然这个问题特别要求没有边缘效应的解决方案,但是这里的一些答案提出了CommonsWare的解决方法的变通方法,比如kaw的建议。
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中实现了这个功能:
你需要在viewpager的适配器上覆盖 getPageWidth()
方法。例如:
@Override
public float getPageWidth(int position) {
return 0.9f;
}
将那段代码放到你的Adapter中,你就会理解。
请看这篇博客文章。
PagerContainer技术解决了我的问题。
编辑:
我找到了相同的答案。
如何从Gallery迁移到HorizontalScrollView和ViewPager?
创建你的布局文件: 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外面的页面也可见。但是现在拖动ViewPager外部没有效果。可以通过从ViewPager容器中获取触摸事件,并将其传递给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的限制不允许这样的操作。ViewPager只能一次显示一页。您可以尝试通过使用片段,将两个ViewPager片段并排放置,并使用按钮来实现您想要实现的页面翻转,但代码可能会变得非常复杂。
您可以尝试使用ViewFlipper - 在其中可以进行更多自定义(包括动画)。
希望这能帮到您。
这可以在 Viewpager 的Item Layout 中完成。假设您想同时显示两页。
这是Item 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;
}
超过两个项目的编辑版本
如果您需要超过两个项目,请先将您的项目添加到LinearLayout中,然后使用以下算法:
photoBox1.setImageResource(photosIds[position]);
if(position < photosIds.length-i-1){
photoBox2.setImageResource(photosIds[position+1]);
photoBox3.setImageResource(photosIds[position+2]);
.
.
.
photoBox(i).setImageResource(photosIds[position+i-1]);
} else if(position < photosIds.length-i-2){
photoBox2.setImageResource(photosIds[position+1]);
photoBox3.setImageResource(photosIds[position+2]);
.
.
.
photoBox(i-1).setImageResource(photosIds[position+i-2]);
photoBox(i).setImageResource(photosIds[0]);
} . . . else if(position < photosIds.length-1){
photoBox2.setImageResource(photosIds[position+1]);
photoBox3.setImageResource(photosIds[0]);
photoBox4.setImageResource(photosIds[1]);
.
.
.
photoBox(i-1).setImageResource(photosIds[i-2-2]);
photoBox(i).setImageResource(photosIds[i-2-1]);
} else {
photoBox2.setImageResource(photosIds[0]);
photoBox3.setImageResource(photosIds[1]);
.
.
.
photoBox(i-1).setImageResource(photosIds[i-1-2]);
photoBox(i).setImageResource(photosIds[i-1-1]);
}
i :您的项目数量
[i-2-2]:中间的数字 2 是最后一页视图页面中项目的数量。