Android使用ViewPager實現(xiàn)屏幕滑動效果
使用ViewPager實現(xiàn)屏幕滑動
從一個完整的屏幕移動到另一個屏幕的過程被稱為屏幕滑動,在安裝向導、幻燈片中應用廣泛。下面介紹如何利用Android Support庫的ViewPager來實現(xiàn)屏幕滑動。
創(chuàng)建View
創(chuàng)建一個在之后作為fragment的內容的布局文件,下面的例子中包含一個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)建一個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)建任意個該fragment的實例來向用戶展示內容了。
添加ViewPager
ViewPager內嵌了對滑動手勢的支持,因此它在默認設置下就能夠實現(xiàn)屏幕滑動。
首先,創(chuàng)建一個布局文件,包含一個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)建一個Activity,包含以下內容:
將其Content View設置為上面創(chuàng)建的布局
創(chuàng)建一個FragmentStatePagerAdapter的子類,并實現(xiàn)其getItem()方法來提供頁面、getCount()方法來確定頁面數(shù)量。
將FragmentStatePagerAdapter實例和ViewPager實例綁定。
處理設備的返回鍵,使其能夠從虛擬的Fragment棧中移除Fragment來實現(xiàn)返回上一頁的效果。如果當前已經(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自定義屏幕滑動效果
可以實現(xiàn)ViewPager.PageTransformer接口來展示一個不同于默認實現(xiàn)的屏幕滑動效果。這個接口中只有一個transformPage()方法。在屏幕滑動過程中它會在那些能夠看到的頁面(當前頁面以及鄰近頁面)上反復調用。例如,假設當前位于第三頁,如果用戶向第四頁滑動,那么transformPage()會在第二、第三、第四頁上被調用。
當實現(xiàn)transformPage()時,你需要根據(jù)頁面當前所處的位置(相對于屏幕)來確定它的變化。不同的變化就能帶來不同的屏幕滑動效果。頁面相對于屏幕的位置包含在參數(shù)position中。
position指明了一個給定的頁面相對于屏幕中心的位置。這是一個動態(tài)的屬性,會隨著用戶的滑動手勢而變化。當頁面充滿屏幕時,position的值為0;當頁面即將在屏幕左側消失時,它的值趨近于-1;當頁面即將在屏幕右側消失時,它的值趨近于1。根據(jù)position的值,你可以使用setTranslationX()、setScaleY()等方法來實現(xiàn)自定義的動畫效果。
當實現(xiàn)了一個PageTransformer之后,使用ViewPager的setPageTransformer()方法將動畫投入使用。示例如下:
ViewPager mPager = (ViewPager) findViewById(R.id.pager); ... mPager.setPageTransformer(true, new ZoomOutPageTransformer());
需要注意的是,默認的屏幕滑動效果不會被PageTransformer覆蓋,因此計算屬性值是要考慮是否會導致滑動速度變快或是變慢。
下面是兩個PageTransformer的實現(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);
}
}
}
原文:鏈接
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- Android?ViewPager實現(xiàn)左右滑動翻頁效果
- android自定義ViewPager水平滑動彈性效果
- Android 中基于TabLayout+ViewPager實現(xiàn)標簽卡效果
- Android 中 viewpager 滑動指示器的實例代碼
- Android開發(fā)實現(xiàn)的ViewPager引導頁功能(動態(tài)加載指示器)詳解
- Android中fragment+viewpager實現(xiàn)布局
- Android實現(xiàn)單頁顯示3個Item的ViewPager炫酷切換效果
- Android viewpager自動輪播和小圓點聯(lián)動效果
- Android實現(xiàn)界面內嵌多種卡片視圖(ViewPager、RadioGroup)
- Android viewpager無限輪播獲取網(wǎng)絡圖片功能
- Android 中ViewPager中使用WebView的注意事項
- Android ViewPager實現(xiàn)左右滑動的實例
- Android UI設計與開發(fā)之ViewPager仿微信引導界面以及動畫效果
- Android UI設計與開發(fā)之使用ViewPager實現(xiàn)歡迎引導頁面
- Android UI設計與開發(fā)之ViewPager介紹和簡單實現(xiàn)引導界面
- Android使用ViewPager實現(xiàn)頂部tabbar切換界面
- Android ViewPager導航小圓點實現(xiàn)無限循環(huán)效果
- Android ViewPager無限循環(huán)滑動并可自動滾動完整實例
相關文章
簡單掌握Android Widget桌面小部件的創(chuàng)建步驟
這篇文章主要介紹了簡單掌握Android Widget桌面小部件的創(chuàng)建步驟,Widget一般采用web前端技術進行開發(fā),需要的朋友可以參考下2016-03-03
Android?Studio?2022.1.1創(chuàng)建項目的Gradle配置問題
這篇文章主要介紹了Android?Studio?2022.1.1創(chuàng)建項目的Gradle配置問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04
Android開發(fā)MQTT協(xié)議的模型及通信淺析
這篇文章主要W為大家介紹了Android開發(fā)MQTT協(xié)議的模型及通信淺析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03
Android實現(xiàn)帶指示器的自動輪播式ViewPager
這篇文章主要為大家詳細介紹了Android實現(xiàn)帶指示器的自動輪播式ViewPager的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02
Android中SurfaceView和普通view的區(qū)別及使用
SurfaceView第一印象它是一個view,因為它繼承了View,本文主要介紹了SurfaceView和普通view的區(qū)別及使用,感興趣的小伙伴們可以參考一下2021-06-06
Android最簡單的狀態(tài)切換布局實現(xiàn)教程
這篇文章主要給大家介紹了關于Android中最簡單的狀態(tài)切換布局的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-10-10
Android中AlertDilog顯示簡單和復雜列表的方法
這篇文章主要介紹了Android中AlertDialog顯示簡單和復雜列表的方法,結合實例形式分析了Android的AlertDialog創(chuàng)建列表顯示對話框的相關方法與常見操作技巧,需要的朋友可以參考下2016-08-08

