美文网首页高级UI
ViewPager<第六篇>:画廊效果实现

ViewPager<第六篇>:画廊效果实现

作者: NoBugException | 来源:发表于2019-12-25 21:51 被阅读0次

ViewPager的画廊效果比较简单,下面直接按步骤实现。

【第一步】 写好基本ViewPager界面

341.gif

【第二步】 实现Viewpager无限循环

在PagerAdapter需要注意的两个方法

@Override
public int getCount() {
    return Integer.MAX_VALUE;
}

@Override
public Object instantiateItem(ViewGroup container, int position) {

    position %= mData.size();

    // ...

    return view;
}
342.gif

【第三步】 设置Viewpager页面宽度,不让它沾满整个屏幕

    int pagerWidth = (int) (getResources().getDisplayMetrics().widthPixels * 4.0f / 5.0f);
    ViewGroup.LayoutParams lp = viewpager.getLayoutParams();
    if (lp == null) {
        lp = new ViewGroup.LayoutParams(pagerWidth, ViewGroup.LayoutParams.MATCH_PARENT);
    } else {
        lp.width = pagerWidth;
    }
    viewpager.setLayoutParams(lp);

【第四步】 将clipChild设置为false

clipChild用来定义他的子控件是否要在他应有的边界内进行绘制。 默认情况下,clipChild被设置为true,也就是不允许进行扩展绘制。

图片.png 343.gif

如图所示,将clipChild设置为false之后,屏幕上绘制了3个page,然而,默认情况下,在内存中缓存页面的数量为3,所以导致左右滑动时,出现页面延迟加载的情况,这时,需要将缓存页面的数量调大。

【第五步】 设置预加载数量

    //设置预加载数量
    viewpager.setOffscreenPageLimit(2);

将limit设置为2之后,缓存中最多可以有5个页面了,所以不存在页面加载延迟的问题。

344.gif

【第六步】 调整边距

    //设置间距
    viewpager.setPageMargin(50);

为了界面更加友好,还需要调整页面间的边距。

345.gif

【第七步】 设置滑动效果

为了无限接近画廊效果,可以使用ZoomOutPageTransformer实现。

viewpager.setPageTransformer(true,new ZoomOutPageTransformer());
public class ZoomOutPageTransformer implements ViewPager.PageTransformer {
    private static final float MIN_SCALE = 0.85f;
    private static final float MIN_ALPHA = 0.5f;
    @SuppressLint("NewApi")
    public void transformPage(View view, float position)
    {
        int pageWidth = view.getWidth();
        int pageHeight = view.getHeight();

        if (position < -2) {

            view.setAlpha(MIN_ALPHA);

        } else if (position <= 2){
            float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
            float vertMargin = pageHeight * (1 - scaleFactor) / 2;
            float horzMargin = pageWidth * (1 - scaleFactor) / 2;
            if (position < 0) {
                view.setTranslationX(horzMargin - vertMargin / 2);
            } else {
                view.setTranslationX(-horzMargin + vertMargin / 2);
            }
            view.setScaleX(scaleFactor);
            view.setScaleY(scaleFactor);
            view.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA));
        } else {
            view.setAlpha(0);
        }
    }
}

最终效果如下:

346.gif

[本章完...]

相关文章

网友评论

    本文标题:ViewPager<第六篇>:画廊效果实现

    本文链接:https://www.haomeiwen.com/subject/yhqgkctx.html