【问题标题】:ViewPager show next and before item preview on screenViewPager 在屏幕上显示项目预览的下一个和之前
【发布时间】:2015-08-14 20:38:13
【问题描述】:

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

你可以看看这张图片

我该怎么做?

【问题讨论】:

标签: android android-viewpager pager


【解决方案1】:

最后,我做到了:)我修改了这个答案Android - Carousel like widget which displays a portion of the left and right elements

你可以看看这段代码。

//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);
                   }
                }

             }
          });

//PagerAdapter

public class CampaignPagerAdapter extends FragmentStatePagerAdapter {
   SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();

   public CampaignPagerAdapter(FragmentManager fm) {
      super(fm);
   }

   @Override
   public int getCount() {
      return 5;
   }

   @Override
   public Fragment getItem(int position) {
      return new CampaignPagerFragment();
   }

   @Override
   public Object instantiateItem(ViewGroup container, int position) {
      Fragment fragment = (Fragment) super.instantiateItem(container, position);
      registeredFragments.put(position, fragment);
      return fragment;
   }

   @Override
   public void destroyItem(ViewGroup container, int position, Object object) {
      registeredFragments.remove(position);
      super.destroyItem(container, position, object);
   }

   public Fragment getRegisteredFragment(int position) {
      return registeredFragments.get(position);
   }
}

例如:https://github.com/mrleolink/SimpleInfiniteCarousel..

你好,缺少一件事 sampleFragment.scaleImage(scale); 它是在 CampaignPagerFragment 中创建的一种方法,它可以缩放片段 roo​​tView..

例如public void scaleImage(float scaleX) { rootView.setScaleY(scaleX); rootView.invalidate(); }

【讨论】:

  • 嗨,当我使用此代码时,当我在第一个项目上时,左侧项目不显示。左边的项目实际上应该是列表中的最后一个使其循环的项目。用这段代码可以实现吗?
  • 有没有办法让下一个项目和预览项目模糊,然后在焦点上消除模糊?
  • 在“onPageSelected(int position)”中你可以移除模糊@MrG
  • 什么是 RATIO_SCALE?
  • 您好,感谢您的代码。但我有一个小问题:显示了 3 页,但右侧的一个刻度在滑动后首先不起作用。如何设置右侧和左侧的刻度应用程序运行时页面均等。
【解决方案2】:

您可以使用 PagerTransformer 到 ViewPager :-

mViewPager.setPageTransformer(false, new ViewPager.PageTransformer() {
     @Override
     public void transformPage(View page, float position) {
             // do transformation here
      }
     });

使用此链接获取完整教程:-

http://andraskindler.com/blog/2013/create-viewpager-transitions-a-pagertransformer-example/

希望对你有帮助:)

【讨论】:

    【解决方案3】:

    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);
            }
        }
    });
    

    【讨论】:

    • @KaveeshKanwal 它在我的应用程序中工作吗?你有什么问题
    • 在我的情况下,它不是使用片段而是动态视图。
    【解决方案4】:

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

    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));
        }
    });
    

    【讨论】:

      【解决方案5】:

      我通过根据位置更改我的 viewpager 的填充来做到这一点。

      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) {
          }
      });
      

      【讨论】:

        猜你喜欢
        • 2012-06-24
        • 2013-02-23
        • 1970-01-01
        • 2015-05-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-03
        • 1970-01-01
        • 2016-05-29
        相关资源
        最近更新 更多