时间:2021-05-20
使用ViewPager实现屏幕滑动
从一个完整的屏幕移动到另一个屏幕的过程被称为屏幕滑动,在安装向导、幻灯片中应用广泛。下面介绍如何利用Android Support库的ViewPager来实现屏幕滑动。
创建View
创建一个在之后作为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>创建Fragment
创建一个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; }}创建完成之后,就可以在父Activity中创建任意个该fragment的实例来向用户展示内容了。
添加ViewPager
ViewPager内嵌了对滑动手势的支持,因此它在默认设置下就能够实现屏幕滑动。
首先,创建一个布局文件,包含一个ViewPager:
创建一个Activity,包含以下内容:
将其Content View设置为上面创建的布局
创建一个FragmentStatePagerAdapter的子类,并实现其getItem()方法来提供页面、getCount()方法来确定页面数量。
将FragmentStatePagerAdapter实例和ViewPager实例绑定。
处理设备的返回键,使其能够从虚拟的Fragment栈中移除Fragment来实现返回上一页的效果。如果当前已经处于第一页,那么就从Activity中返回。
使用PageTransformer自定义屏幕滑动效果
可以实现ViewPager.PageTransformer接口来展示一个不同于默认实现的屏幕滑动效果。这个接口中只有一个transformPage()方法。在屏幕滑动过程中它会在那些能够看到的页面(当前页面以及邻近页面)上反复调用。例如,假设当前位于第三页,如果用户向第四页滑动,那么transformPage()会在第二、第三、第四页上被调用。
当实现transformPage()时,你需要根据页面当前所处的位置(相对于屏幕)来确定它的变化。不同的变化就能带来不同的屏幕滑动效果。页面相对于屏幕的位置包含在参数position中。
position指明了一个给定的页面相对于屏幕中心的位置。这是一个动态的属性,会随着用户的滑动手势而变化。当页面充满屏幕时,position的值为0;当页面即将在屏幕左侧消失时,它的值趋近于-1;当页面即将在屏幕右侧消失时,它的值趋近于1。根据position的值,你可以使用setTranslationX()、setScaleY()等方法来实现自定义的动画效果。
当实现了一个PageTransformer之后,使用ViewPager的setPageTransformer()方法将动画投入使用。示例如下:
需要注意的是,默认的屏幕滑动效果不会被PageTransformer覆盖,因此计算属性值是要考虑是否会导致滑动速度变快或是变慢。
下面是两个PageTransformer的实现示例:
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); } }}原文:链接
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前面写过了使用ViewFlipper和ViewPager实现屏幕中视图切换的效果(ViewPager未实现轮播)附链接:ANDROID中使用VIEWFLIPPE
实现ViewPager的滑动翻页效果可以使用ViewPager的setPageTransformer方法,如下:importandroid.content.Co
对Android利用ViewPager实现图片可以左右循环滑动效果,感兴趣的朋友可以直接点击查看内容详情。主要介绍如何实现ViewPager自动播放,循环滚动的
Android编程常常使用ViewPager结合Fragment实现可以左右滑动切换的页面,但有时会遇到这样的需求,让ViewPager根据特定条件来控制其是否
在android应用中,多屏滑动是一种很常见的风格,没有采用viewpager的代码实现会很长,如果采用ViewPager,代码就会短很多,但是使用ViewPa