Android ViewPager在屏幕上显示下一个和前一个项目预览

Android ViewPager在屏幕上显示下一个和前一个项目预览,android,android-viewpager,pager,Android,Android Viewpager,Pager,我想在屏幕中的页面预览之前显示viewpager。前一页和下一页在屏幕中显示深度,并用深度动画滑动下一页 你可以看看这个图像 我怎么做 您可以使用PagerTransformer来查看Pager:- mViewPager.setPageTransformer(false, new ViewPager.PageTransformer() { @Override public void transformPage(View page, float position) {

我想在屏幕中的页面预览之前显示viewpager。前一页和下一页在屏幕中显示深度,并用深度动画滑动下一页

你可以看看这个图像

我怎么做


您可以使用PagerTransformer来查看Pager:-

mViewPager.setPageTransformer(false, new ViewPager.PageTransformer() {
     @Override
     public void transformPage(View page, float position) {
             // do transformation here
      }
     });
使用此链接可获得完整的教程:-

希望这对你有帮助:)最后,我做到了:)我修改了这个答案

您可以查看此代码

//pager settings
          pager.setClipToPadding(false);
          pager.setPageMargin(24);
          pager.setPadding(48, 8, 48, 8);
          pager.setOffscreenPageLimit(3);
          pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

             @Override
             public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                Log.i("", "onPageScrolled: " + position);

                CampaignPagerFragment sampleFragment = (CampaignPagerFragment) ((CampaignPagerAdapter) pager.getAdapter()).getRegisteredFragment(position);


                float scale = 1 - (positionOffset * RATIO_SCALE);

                // Just a shortcut to findViewById(R.id.image).setScale(scale);
                sampleFragment.scaleImage(scale);


                if (position + 1 < pager.getAdapter().getCount()) {
                   sampleFragment = (CampaignPagerFragment) ((CampaignPagerAdapter) pager.getAdapter()).getRegisteredFragment(position + 1);
                   scale = positionOffset * RATIO_SCALE + (1 - RATIO_SCALE);
                   sampleFragment.scaleImage(scale);
                }
             }

             @Override
             public void onPageSelected(int position) {
                Log.i("", "onPageSelected: " + position);
             }

             @Override
             public void onPageScrollStateChanged(int state) {
                Log.i("", "onPageScrollStateChanged: " + state);
                if (state == ViewPager.SCROLL_STATE_IDLE) {
                   CampaignPagerFragment fragment = (CampaignPagerFragment) ((CampaignPagerAdapter) pager.getAdapter()).getRegisteredFragment(pager.getCurrentItem());
                   fragment.scaleImage(1);
                   if (pager.getCurrentItem() > 0) {
                      fragment = (CampaignPagerFragment) ((CampaignPagerAdapter) pager.getAdapter()).getRegisteredFragment(pager.getCurrentItem() - 1);
                      fragment.scaleImage(1 - RATIO_SCALE);
                   }

                   if (pager.getCurrentItem() + 1 < pager.getAdapter().getCount()) {
                      fragment = (CampaignPagerFragment) ((CampaignPagerAdapter) pager.getAdapter()).getRegisteredFragment(pager.getCurrentItem() + 1);
                      fragment.scaleImage(1 - RATIO_SCALE);
                   }
                }

             }
          });
//寻呼机设置
pager.setCliptPadding(false);
寻呼机设置页边距(24);
寻呼机设置填充(48,8,48,8);
pager.setOffscreenPageLimit(3);
pager.setOnPageChangeListener(新的ViewPager.OnPageChangeListener(){
@凌驾
已滚动页面上的公共无效(int-position、float-positionOffset、int-positionOffsetPixels){
Log.i(“,”在页面上滚动:“+位置);
ActivityPagerFragment sampleFragment=(ActivityPagerFragment)((ActivityPageRadapter)pager.getAdapter()).getRegisteredFragment(位置);
浮动刻度=1-(位置偏移*比率\刻度);
//只是一个findViewById(R.id.image)的快捷方式;
sampleFragment.scaleImage(比例);
if(位置+10){
fragment=(ActivityPagerFragment)((ActivityPageRadapter)pager.getAdapter()).getRegisteredFragment(pager.getCurrentItem()-1);
片段.标度图像(1-比例/标度);
}
if(pager.getCurrentItem()+1

//PagerAdapter
公共类活动PageRadapter扩展了FragmentStatePagerAdapter{
SparseArray registeredFragments=新SparseArray();
公共活动页面雷达(碎片管理器fm){
超级(fm);
}
@凌驾
public int getCount(){
返回5;
}
@凌驾
公共片段getItem(int位置){
返回新的活动页面片段();
}
@凌驾
公共对象实例化项(视图组容器,int位置){
Fragment Fragment=(Fragment)super.instanceItem(容器,位置);
注册碎片。放置(位置,碎片);
返回片段;
}
@凌驾
公共项(视图组容器、int位置、对象){
注册碎片。移除(位置);
超级项目(容器、位置、对象);
}
公共片段getRegisteredFragment(int位置){
返回registeredFragments.get(位置);
}
}
例如:

你好,少了一件东西 sampleFragment.scaleImage(比例); 它是在ActivityPagerFragment中创建的一个方法,它可以缩放片段根视图

e、 g
public void scaleImage(float-scaleX)
{
rootView.setScaleY(scaleX);
rootView.invalidate();
}

viewPager.setPageMargin(100);
viewPager.setPageTransformer(false,新建viewPager.PageTransformer()
{
@凌驾
公共页面(查看页面、浮动位置)
{
int pageWidth=viewPager.getMeasuredWidth()-
viewPager.getPaddingLeft()-viewPager.getPaddingRight();
int pageHeight=viewPager.getHeight();
int paddingLeft=viewPager.getPaddingLeft();
float transformPos=(float)(page.getLeft()-
(viewPager.getScrollX()+paddingLeft))/pageWidth;
int max=页面高度/10;
如果(转换位置<-1)
{
//[-无穷大,-1)
//这个页面在屏幕的左边。
page.setAlpha(0.5f);//使左侧透明
第页:设置刻度(0.7f);
}
否则,如果(转换位置
为此,我根据位置更改了viewpager的填充


我认为这是最简单、最干净的解决方案

float scaleFactor = 0.85f;
viewPager.setPageMargin(-35);
viewPager.setOffscreenPageLimit(2);
viewPager.setPageTransformer(false, new ViewPager.PageTransformer() {
    @Override
    public void transformPage(@NonNull View page, float position) {
        page.setScaleY((1 - Math.abs(position) * (1 - scaleFactor)));
        page.setScaleX(scaleFactor + Math.abs(position) * (1 - scaleFactor));
    }
});

试一试你是否完美地解决了这个问题。我的案例低调节手机工作正常,但高度调节手机不工作。嗨,当我使用此代码时,当我在第一项上时,左项不显示。事实上,左项应该是列表中的最后一项,以使其循环。这是否可以用此代码实现?是否存在使下一个项目和预览项目模糊的方法,然后在“onPageSelected(int position)”中的“聚焦时消除模糊”您可以删除Blur@MrGwhat是RATIO_SCALE?您好,谢谢您的代码。但我有一个小问题:显示了3页,但右一个比例在刷卡后首先不起作用。当应用程序运行时,我如何设置左右两侧页面的比例。@KaveeshKanwal在我的应用程序中起作用了吗?在我的情况下,您有什么问题吗不使用片段,但使用动态视图
viewPager.setPageMargin(100);
viewPager.setPageTransformer(false, new ViewPager.PageTransformer()
{
    @Override
    public void transformPage(View page, float position)
    {
        int pageWidth = viewPager.getMeasuredWidth() -
            viewPager.getPaddingLeft() - viewPager.getPaddingRight();
        int pageHeight = viewPager.getHeight();
        int paddingLeft = viewPager.getPaddingLeft();
        float transformPos = (float) (page.getLeft() -
            (viewPager.getScrollX() + paddingLeft)) / pageWidth;
        int max = pageHeight / 10;
        if (transformPos < -1)
        {
            // [-Infinity,-1)
            // This page is way off-screen to the left.
            page.setAlpha(0.5f);// to make left transparent
            page.setScaleY(0.7f);
        }
        else if (transformPos <= 1)
        {
            // [-1,1]
            page.setScaleY(1f);
        }
        else
        {
            // (1,+Infinity]
            // This page is way off-screen to the right.
            page.setAlpha(0.5f);// to make right transparent
            page.setScaleY(0.7f);
        }
    }
});
carouselViewHolder.carouselViewPager.setPadding(Utils.dpToPixels(context, 12), 0, Utils.dpToPixels(context, paddingRequired - 12), 0); // initial padding for position 0
carouselViewHolder.carouselViewPager.setPageMargin(Utils.dpToPixels(context, 12)); // margin between pages
carouselViewHolder.carouselViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    }
    @Override
    public void onPageSelected(int position) {
        if (position != 0) {
            if (position == playCardData.getPlayCards().size() - 1) {
                carouselViewHolder.carouselViewPager.setPadding(Utils.dpToPixels(context, finalPaddingRequired - 12), 0, Utils.dpToPixels(context, 12), 0);
            } else
                carouselViewHolder.carouselViewPager.setPadding(Utils.dpToPixels(context, finalPaddingRequired / 2), 0, Utils.dpToPixels(context, finalPaddingRequired / 2), 0);
        } else {
            carouselViewHolder.carouselViewPager.setPadding(Utils.dpToPixels(context, 12), 0, Utils.dpToPixels(context, finalPaddingRequired - 12), 0);
        }
    }
    @Override
    public void onPageScrollStateChanged(int state) {
    }
});
float scaleFactor = 0.85f;
viewPager.setPageMargin(-35);
viewPager.setOffscreenPageLimit(2);
viewPager.setPageTransformer(false, new ViewPager.PageTransformer() {
    @Override
    public void transformPage(@NonNull View page, float position) {
        page.setScaleY((1 - Math.abs(position) * (1 - scaleFactor)));
        page.setScaleX(scaleFactor + Math.abs(position) * (1 - scaleFactor));
    }
});