ViewPager和视差动画

ViewPager和视差动画

最近在做APP的启动页,总结下用到的知识。

ViewPager的几个回调

PagerAdapter

PagerAdapterViewPager最重要的Adapter, 一个ViewPager下面的page的加载以及Page滑动都要靠它来完成。为了达到高效的滑动和最低的内存消耗,实际上ViewPager只会加载当前page以及其左右各一个page。当page滑动到n页,则会自动回调instantiateItem加载n-1和n+1页的page。若已经加载过的page已经脱离了这3个要加载的page,则会回调destroyItem来将其回收掉。

public class WelcomePageAdapter extends PagerAdapter{
     public WelcomePageAdapter() {
     } 

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        LogUtil.d(TAG, "instantiateItem.......position = " + position); 
        View view = MainActivity.this.createWelcomePageView(position);
        return view; 
    } 

    @Override
    public void destroyItem(ViewGroup container, int position, Object object)
    {
        container.removeView((View)object);
    }

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

    @Override 
    public boolean isViewFromObject(View arg0, Object arg1) {
    }
}

OnPageChangeListener

OnPageChangeListener是滑动时page改变的回调,这几个接口都十分有用。
onPageSelected(int position)在滑动完全停止,页面完全显示的时候回调,position即指当前页面的index(从0开始计数)。
onPageScrolled(int position, float positionOffset, int positionOffsetPixels)在滑动过程中调用;positiononPageSelected中的参数是一样的含义;positionOffset指当前页滑动的比例(从0 - 1的浮点数);positionOffsetPixels指当前页滑动的像素。
onPageScrollStateChanged(int state)在滑动状态改变的时候调用;分别可能为SCROLL_STATE_IDLESCROLL_STATE_DRAGGINGSCROLL_STATE_SETTLING

class GuidePageChangeListener implements ViewPager.OnPageChangeListener {
    ArgbEvaluator mColorEvaluator;
    int mPageWidth;
    int mTotalScrollWidth;
    int mGuideStartBackgroundColor;
    int mGuideEndBackgroundColor;

    public GuidePageChangeListener() {
        mColorEvaluator = new ArgbEvaluator();
        mPageWidth = MainActivity.this.getWindowManager().getDefaultDisplay().getWidth();
        mTotalScrollWidth = mPageWidth * 2;
        mGuideStartBackgroundColor = getResources().getColor(R.color.welcome_page_bg_1);
        mGuideEndBackgroundColor = getResources().getColor(R.color.welcome_page_bg_2);
    }

    @Override
    public void onPageSelected(int position)
    {
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
    {
        float ratio = (mPageWidth * position + positionOffsetPixels) / (float) mTotalScrollWidth;
        Integer color = (Integer) mColorEvaluator.evaluate(ratio, mGuideStartBackgroundColor, mGuideEndBackgroundColor);
        welcomeViewPager.setBackgroundColor(color);
    }

    @Override
    public void onPageScrollStateChanged(int state)
    {
    }
}

背景渐变

ViewPager滑动的过程,如何让背景在滑动过程产生顺滑的变化?
实际上,上面的代码已经实现了这一功能。要实现背景渐变,不得不提到属性动画和ArgbEvaluator
以前的ViewAnimation只能改变View的一些属性,现在属性动画突破了这个限制。所有你想改变的属性,都可以改变。
ArgbEvaluator实现了TypeEvaluator(继承TypeEvaluator还有FloatArrayEvaluator, FloatEvaluator, IntArrayEvaluator, IntEvaluator, PointFEvaluator, RectEvaluator),可以通过ArgbEvaluator来估算两个颜色之间任意部分的色值。
利用ArgbEvaluatorOnPageChangeListener我们就可以实现滑动中颜色的平滑过渡了。

参考博客:http://ryanhoo.github.io/blog/2014/07/16/step-by-step-implement-parallax-animation-for-splash-screen-of-zhihu/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
parallaxviewpager是一个具有视差滚动效果的ViewPager。所谓视差滚动(Parallax Scrolling)是指让多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验。parallaxviewpager通过设置一个背景图片,使原有的ViewPager页面与这个背景图片间实现视差效果。这就要求你的背景图片的高宽比要大于屏幕的高宽比。效果非常不错。项目地址:https://github.com/andraskindler/parallaxviewpager 效果图:如何使用:parallaxviewpager是扩展了ViewPager,所有基本使用二者是相同的。在xml中布局中创建ParallaxViewPager<com.andraskindler.parallaxviewpager.ParallaxViewPager          android:id="@ id/viewPager"          android:layout_width="match_parent"          android:layout_height="match_parent"/>2. 创建了ParallaxViewPager之后,可以使用下面的方法来设置背景,或者也可以xml设置:1) setBackgroundResource(int resid)2) setBackground(Drawable background) or setBackgroundDrawable(Drawable background)3) setBackground(Bitmap bitmap)这就好了,你现在可以使用ParallaxViewPager的全部功能了。你可以修改背景的滚动效果来优化用户体验。你也可以使用setScaleType(final int scaleType)方法来配置视图的图像缩放方式。这个方法只能和FIT_HEIGHT搭配使用,从下面的参数中进行选择:FIT_HEIGHT表示缩放图像的高度以便适配视图的高度,同时缩放图像的宽度以便保持宽高比。bitmap的不可见部分被划分成相同的区域,每个区域插入到合适的位置。FIT_HEIGHT是默认值。FIT_WIDTH表示背景图像的宽度被划分成相同的块,每一块占满整个屏幕的宽度。这个模式不适用于视差效果,因为背景和视图的滚动速度一样。你也可以使用setOverlapPercentage(final float percentage) 方法来设置重叠的程度。重叠程度值介于0到1之间,这个值越小背景就滚动地越慢,默认值是50%。ParallaxViewPageviewPager = (ParallaxViewPager)this.findViewById(R.id.viewPager); viewPager.setBackgroundResource(R.drawable.bg); viewPager.setOverlapPercentage(0.75f); PageAdapter adapter = new PageAdapter(getSupportFragmentManager()); viewPager.setAdapter(adapter);项目作者并没有提供demo,完整实例可点击上面的"下载源码"获得。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值