ParallaxViewPager:ViewPager的視差背景效果
來自: http://www.jcodecraeer.com//a/anzhuokaifa/androidkaifa/2014/1113/1972.html
所謂的視差效果在Web設計和移動應用中都非常常見,我們在一些主要的平臺都可以發現它的身影,從Windows Phone到iOS乃至Android。按照維基百科的說法,視差滾動是計算機圖形學中的一種特殊的滾動技術,在此相機移動背景圖像比前景圖像慢,從而引起了視覺深度的假象。作為一個受歡迎的但是沒有被過度使用的效果,視差效果可以和ViewPager很好地搭配使用,并且能夠帶來令人驚奇的用戶體驗。Android SDK沒有提供內置的方式來實現視差效果,因此我自己實現了這個效果。
網絡上已經有許多種實現視差效果的方案,但是沒有一個可以完美地滿足我的需求。GitHub用戶ChrisJenx實現的Paralloid library算是一個很好的方案,可惜它不能和ViewPager一起用。大多數解決方案是基于定制化的PagerTransformer,然而我嘗試了一個與眾不同的方法,這個方法是通過擴展ViewPager以及定制化onDraw邏輯來實現的。
使用ParallaxViewPager
設置只需很少的額外工作,使用ParallaxViewPager就像使用標準的ViewPager一樣,適配器也一樣。當然,沒有什么東西是萬能的 ? 開發者必須提供適合當前需求的背景(例如,適配器中項目數量以及ViewPager的尺寸)。
首先,在你的工程中包含Gradle的依賴:
dependencies { compile 'com.andraskindler.parallaxviewpager:parallaxviewpager:0.2.0' }
在layout xml或者程序中創建了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%。
示例
在Activity的onCreate()方法中創建ParallaxViewPager實例:
//... final ParallaxViewPager parallaxViewPager = new ParallaxViewPager(this); parallaxViewPager.setAdapter(new MyPagerAdapter()); parallaxViewPager.setBackgroundResource(R.drawable.background); setContentView(parallaxViewPager); //...
在layout xml文件中創建ParallaxViewPager,然后修改重疊百分比以及設置適配器:
activity_main.xml
<com.andraskindler.parallaxviewpager.ParallaxViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/parallaxviewpager" android:layout_width="match_parent" android:background="@drawable/background" android:layout_height="match_parent" />
MainActivity.java
//.... setContentView(R.layout.activity_main); final ParallaxViewPager parallaxViewPager = ((ParallaxViewPager) findViewById(R.id.parallaxviewpager)); parallaxViewPager .setOverlapPercentage(0.25f) .setAdapter(new PagerAdapter() //...
總結
這個課程還遠沒有達到完成的要求,尚有很多提升空間,所以不要猶豫和有所隱瞞,歡迎各種想法、反饋以及請求。你可以在http://jcodecraeer.com/a/opensource/2014/1113/1973.html找到這個項目。