【Interface&navigation】使用ViewPager在片段之间滑动(67)

屏幕幻灯片是整个屏幕到另一个屏幕之间的过渡,并且与设置向导或幻灯片等UI一样常见。本课程向您介绍如何使用支持库ViewPager提供的屏幕幻灯片。 s可以自动为屏幕幻灯片设置动画。以下是从一个内容屏幕转换到下一个屏幕的屏幕幻灯片: ViewPager

屏幕幻灯片动画

如果您想跳过并查看完整的工作示例,请 在GitHub上查看此示例应用程序

创建视图


创建一个稍后用于片段内容的布局文件。您还需要为片段的内容定义一个字符串。以下示例包含显示某些文本的文本视图:

<!-- 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>

创建片段


创建一个Fragment类,该类返回您刚刚在onCreateView() 方法中创建的布局。然后,只要需要向用户显示新页面,就可以在父活动中创建此片段的实例:

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;
    }
}

添加ViewPager


ViewPagers具有内置的滑动手势以在页面中转换,并且默认情况下它们显示屏幕幻灯片动画,因此您无需创建自己的动画。ViewPager使用 PagerAdapters作为要显示的新页面的供应,因此PagerAdapter将使用您之前创建的fragment类。

首先,创建一个包含以下内容的布局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" />

创建一个执行以下操作的活动:

将内容视图设置为具有的布局ViewPager。
创建一个扩展FragmentStatePagerAdapter抽象类的类,并实现该getItem()方法以提供ScreenSlidePageFragment新页面的实例。寻呼机适配器还要求您实现该 getCount()方法,该方法返回适配器将创建的页面数量(示例中为五个)。
把它PagerAdapter连接起来ViewPager。

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自定义动画


要从默认屏幕幻灯片动画显示不同的动画,请实现该 ViewPager.PageTransformer界面并将其提供给视图寻呼机。该接口公开了一种方法transformPage()。在屏幕转换的每个点,对于每个可见页面(通常只有一个可见页面)调用此方法一次,对于屏幕外的相邻页面调用此方法。例如,如果第3页可见并且用户拖向第4页, transformPage()则在手势的每个步骤调用第2,3和4页。

在您的实现中transformPage(),您可以通过根据屏幕上页面的位置确定需要转换哪些页面来创建自定义幻灯片动画,该位置是从方法的position参数获得的transformPage()。

该position参数指示给定页面相对于屏幕中心的位置。它是一个动态属性,随着用户滚动页面而变化。当页面填满屏幕时,其位置值为0。当页面刚刚从屏幕右侧绘制时,其位置值为1。如果用户在第一页和第二页之间滚动,第一页的位置为-0.5,第二页的位置为0.5。根据屏幕上的页面的位置,你可以通过与方法,如设置页面属性创建自定义幻灯片动画setAlpha(),setTranslationX()或 setScaleY()。

当您实现a时PageTransformer,请setPageTransformer()使用您的实现调用以应用自定义动画。例如,如果您有 PageTransformer命名 ZoomOutPageTransformer,则可以设置自定义动画,如下所示:

ViewPager mPager = (ViewPager) findViewById(R.id.pager);
...
mPager.setPageTransformer(true, new ZoomOutPageTransformer());

有关 a的示例和视频,请参阅缩小页面变换器和深度页面变换器部分PageTransformer。

缩小页面变换器

当在相邻页面之间滚动时,此页面变换器会缩小和淡化页面。随着页面越来越接近中心,它会逐渐恢复到正常大小并逐渐消失。

ZoomOutPageTransformer 例

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);
        }
    }
}

深度页面变换器

此页面转换器使用默认幻灯片动画向左滑动​​页面,而使用“深度”动画向右滑动页面。此深度动画将页面淡出,并将其线性缩小。

DepthPageTransformer 例
在深度动画期间,仍会发生默认动画(屏幕幻灯片),因此您必须使用负X平移来抵消屏幕幻灯片。例如:

view.setTranslationX(-1 * view.getWidth() * position);

以下示例显示如何在工作页面转换器中抵消默认屏幕幻灯片动画:


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);
        }
    }
}

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【Interface&navigation】使用ViewPager在片段之间滑动(67)

猜你喜欢

转载自blog.51cto.com/4789781/2178013