Android使用ViewPager實(shí)現(xiàn)屏幕滑動(dòng)效果
使用ViewPager實(shí)現(xiàn)屏幕滑動(dòng)
從一個(gè)完整的屏幕移動(dòng)到另一個(gè)屏幕的過程被稱為屏幕滑動(dòng),在安裝向?qū)?、幻燈片中?yīng)用廣泛。下面介紹如何利用Android Support庫的ViewPager來實(shí)現(xiàn)屏幕滑動(dòng)。
創(chuàng)建View
創(chuàng)建一個(gè)在之后作為fragment的內(nèi)容的布局文件,下面的例子中包含一個(gè)Textview,用來展示一些文字。
<!-- fragment_screen_slide_page.xml --> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView style="?android:textAppearanceMedium" android:padding="16dp" android:lineSpacingMultiplier="1.2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/lorem_ipsum" /> </ScrollView>
創(chuàng)建Fragment
創(chuàng)建一個(gè)Fragment子類,并在onCreateView()方法中加載上一步里創(chuàng)建的布局。
import android.support.v4.app.Fragment; ... public class ScreenSlidePageFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ViewGroup rootView = (ViewGroup) inflater.inflate( R.layout.fragment_screen_slide_page, container, false); return rootView; } }
創(chuàng)建完成之后,就可以在父Activity中創(chuàng)建任意個(gè)該fragment的實(shí)例來向用戶展示內(nèi)容了。
添加ViewPager
ViewPager內(nèi)嵌了對滑動(dòng)手勢的支持,因此它在默認(rèn)設(shè)置下就能夠?qū)崿F(xiàn)屏幕滑動(dòng)。
首先,創(chuàng)建一個(gè)布局文件,包含一個(gè)ViewPager:
<!-- activity_screen_slide.xml --> <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" />
創(chuàng)建一個(gè)Activity,包含以下內(nèi)容:
將其Content View設(shè)置為上面創(chuàng)建的布局
創(chuàng)建一個(gè)FragmentStatePagerAdapter的子類,并實(shí)現(xiàn)其getItem()方法來提供頁面、getCount()方法來確定頁面數(shù)量。
將FragmentStatePagerAdapter實(shí)例和ViewPager實(shí)例綁定。
處理設(shè)備的返回鍵,使其能夠從虛擬的Fragment棧中移除Fragment來實(shí)現(xiàn)返回上一頁的效果。如果當(dāng)前已經(jīng)處于第一頁,那么就從Activity中返回。
import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; ... public class ScreenSlidePagerActivity extends FragmentActivity { /** * The number of pages (wizard steps) to show in this demo. */ private static final int NUM_PAGES = 5; /** * The pager widget, which handles animation and allows swiping horizontally to access previous * and next wizard steps. */ private ViewPager mPager; /** * The pager adapter, which provides the pages to the view pager widget. */ private PagerAdapter mPagerAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_screen_slide); // Instantiate a ViewPager and a PagerAdapter. mPager = (ViewPager) findViewById(R.id.pager); mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); mPager.setAdapter(mPagerAdapter); } @Override public void onBackPressed() { if (mPager.getCurrentItem() == 0) { // If the user is currently looking at the first step, allow the system to handle the // Back button. This calls finish() on this activity and pops the back stack. super.onBackPressed(); } else { // Otherwise, select the previous step. mPager.setCurrentItem(mPager.getCurrentItem() - 1); } } /** * A simple pager adapter that represents 5 ScreenSlidePageFragment objects, in * sequence. */ private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { public ScreenSlidePagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return new ScreenSlidePageFragment(); } @Override public int getCount() { return NUM_PAGES; } } }
使用PageTransformer自定義屏幕滑動(dòng)效果
可以實(shí)現(xiàn)ViewPager.PageTransformer接口來展示一個(gè)不同于默認(rèn)實(shí)現(xiàn)的屏幕滑動(dòng)效果。這個(gè)接口中只有一個(gè)transformPage()方法。在屏幕滑動(dòng)過程中它會(huì)在那些能夠看到的頁面(當(dāng)前頁面以及鄰近頁面)上反復(fù)調(diào)用。例如,假設(shè)當(dāng)前位于第三頁,如果用戶向第四頁滑動(dòng),那么transformPage()會(huì)在第二、第三、第四頁上被調(diào)用。
當(dāng)實(shí)現(xiàn)transformPage()時(shí),你需要根據(jù)頁面當(dāng)前所處的位置(相對于屏幕)來確定它的變化。不同的變化就能帶來不同的屏幕滑動(dòng)效果。頁面相對于屏幕的位置包含在參數(shù)position中。
position指明了一個(gè)給定的頁面相對于屏幕中心的位置。這是一個(gè)動(dòng)態(tài)的屬性,會(huì)隨著用戶的滑動(dòng)手勢而變化。當(dāng)頁面充滿屏幕時(shí),position的值為0;當(dāng)頁面即將在屏幕左側(cè)消失時(shí),它的值趨近于-1;當(dāng)頁面即將在屏幕右側(cè)消失時(shí),它的值趨近于1。根據(jù)position的值,你可以使用setTranslationX()、setScaleY()等方法來實(shí)現(xiàn)自定義的動(dòng)畫效果。
當(dāng)實(shí)現(xiàn)了一個(gè)PageTransformer之后,使用ViewPager的setPageTransformer()方法將動(dòng)畫投入使用。示例如下:
ViewPager mPager = (ViewPager) findViewById(R.id.pager); ... mPager.setPageTransformer(true, new ZoomOutPageTransformer());
需要注意的是,默認(rèn)的屏幕滑動(dòng)效果不會(huì)被PageTransformer覆蓋,因此計(jì)算屬性值是要考慮是否會(huì)導(dǎo)致滑動(dòng)速度變快或是變慢。
下面是兩個(gè)PageTransformer的實(shí)現(xiàn)示例:
Zoom-out page transformer
public class ZoomOutPageTransformer implements ViewPager.PageTransformer { private static final float MIN_SCALE = 0.85f; private static final float MIN_ALPHA = 0.5f; public void transformPage(View view, float position) { int pageWidth = view.getWidth(); int pageHeight = view.getHeight(); if (position < -1) { // [-Infinity,-1) // This page is way off-screen to the left. view.setAlpha(0); } else if (position <= 1) { // [-1,1] // Modify the default slide transition to shrink the page as well 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); } // Scale the page down (between MIN_SCALE and 1) view.setScaleX(scaleFactor); view.setScaleY(scaleFactor); // Fade the page relative to its size. view.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA)); } else { // (1,+Infinity] // This page is way off-screen to the right. view.setAlpha(0); } } }
Depth page transformer
public class DepthPageTransformer implements ViewPager.PageTransformer { private static final float MIN_SCALE = 0.75f; public void transformPage(View view, float position) { int pageWidth = view.getWidth(); if (position < -1) { // [-Infinity,-1) // This page is way off-screen to the left. view.setAlpha(0); } else if (position <= 0) { // [-1,0] // Use the default slide transition when moving to the left page view.setAlpha(1); view.setTranslationX(0); view.setScaleX(1); view.setScaleY(1); } else if (position <= 1) { // (0,1] // Fade the page out. view.setAlpha(1 - position); // Counteract the default slide transition view.setTranslationX(pageWidth * -position); // Scale the page down (between MIN_SCALE and 1) float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position)); view.setScaleX(scaleFactor); view.setScaleY(scaleFactor); } else { // (1,+Infinity] // This page is way off-screen to the right. view.setAlpha(0); } } }
原文:鏈接
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android?ViewPager實(shí)現(xiàn)左右滑動(dòng)翻頁效果
- android自定義ViewPager水平滑動(dòng)彈性效果
- Android 中基于TabLayout+ViewPager實(shí)現(xiàn)標(biāo)簽卡效果
- Android 中 viewpager 滑動(dòng)指示器的實(shí)例代碼
- Android開發(fā)實(shí)現(xiàn)的ViewPager引導(dǎo)頁功能(動(dòng)態(tài)加載指示器)詳解
- Android中fragment+viewpager實(shí)現(xiàn)布局
- Android實(shí)現(xiàn)單頁顯示3個(gè)Item的ViewPager炫酷切換效果
- Android viewpager自動(dòng)輪播和小圓點(diǎn)聯(lián)動(dòng)效果
- Android實(shí)現(xiàn)界面內(nèi)嵌多種卡片視圖(ViewPager、RadioGroup)
- Android viewpager無限輪播獲取網(wǎng)絡(luò)圖片功能
- Android 中ViewPager中使用WebView的注意事項(xiàng)
- Android ViewPager實(shí)現(xiàn)左右滑動(dòng)的實(shí)例
- Android UI設(shè)計(jì)與開發(fā)之ViewPager仿微信引導(dǎo)界面以及動(dòng)畫效果
- Android UI設(shè)計(jì)與開發(fā)之使用ViewPager實(shí)現(xiàn)歡迎引導(dǎo)頁面
- Android UI設(shè)計(jì)與開發(fā)之ViewPager介紹和簡單實(shí)現(xiàn)引導(dǎo)界面
- Android使用ViewPager實(shí)現(xiàn)頂部tabbar切換界面
- Android ViewPager導(dǎo)航小圓點(diǎn)實(shí)現(xiàn)無限循環(huán)效果
- Android ViewPager無限循環(huán)滑動(dòng)并可自動(dòng)滾動(dòng)完整實(shí)例
相關(guān)文章
簡單掌握Android Widget桌面小部件的創(chuàng)建步驟
這篇文章主要介紹了簡單掌握Android Widget桌面小部件的創(chuàng)建步驟,Widget一般采用web前端技術(shù)進(jìn)行開發(fā),需要的朋友可以參考下2016-03-03Android設(shè)置鈴聲實(shí)現(xiàn)代碼
這篇文章主要介紹了Android設(shè)置鈴聲實(shí)現(xiàn)代碼,以實(shí)例形式分析了Android中鈴聲設(shè)置的相關(guān)技巧,非常簡單實(shí)用,需要的朋友可以參考下2015-10-10Android?Studio?2022.1.1創(chuàng)建項(xiàng)目的Gradle配置問題
這篇文章主要介紹了Android?Studio?2022.1.1創(chuàng)建項(xiàng)目的Gradle配置問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04Android開發(fā)MQTT協(xié)議的模型及通信淺析
這篇文章主要W為大家介紹了Android開發(fā)MQTT協(xié)議的模型及通信淺析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Android實(shí)現(xiàn)帶指示器的自動(dòng)輪播式ViewPager
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)帶指示器的自動(dòng)輪播式ViewPager的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02Android中SurfaceView和普通view的區(qū)別及使用
SurfaceView第一印象它是一個(gè)view,因?yàn)樗^承了View,本文主要介紹了SurfaceView和普通view的區(qū)別及使用,感興趣的小伙伴們可以參考一下2021-06-06Android最簡單的狀態(tài)切換布局實(shí)現(xiàn)教程
這篇文章主要給大家介紹了關(guān)于Android中最簡單的狀態(tài)切換布局的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10Android中AlertDilog顯示簡單和復(fù)雜列表的方法
這篇文章主要介紹了Android中AlertDialog顯示簡單和復(fù)雜列表的方法,結(jié)合實(shí)例形式分析了Android的AlertDialog創(chuàng)建列表顯示對話框的相關(guān)方法與常見操作技巧,需要的朋友可以參考下2016-08-08