ViewPager系列之ViewPager一屏显示多个子页面

2024-06-18 11:32

本文主要是介绍ViewPager系列之ViewPager一屏显示多个子页面,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ViewPager一屏显示多个子页面,常见的有两种形式:

1、当前展示的页面右侧显示一部分下个页面的内容

这里写图片描述


2、当前页面居中,左右两边分别显示上一个页面、下一个页面

这里写图片描述


第 1 种表现形式的实现代码

其实这种效果很容易实现,谷歌给我们提供了方法,只需要在adapter中重写这个方法就可以了。  
/*** Returns the proportional width of a given page as a percentage of the* ViewPager's measured width from (0.f-1.f]
返回给定的页面所占ViewPager 测量宽度的比例,范围(0,1]** @param position The position of the page requested* @return Proportional width for the given page position*/
public float getPageWidth(int position) {return 1.f;//默认值
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Adapter 代码,重写 getPageWidth(int position) 方法

public class MultiplePagerAdapter extends PagerAdapter {private List<Integer> mList;private LayoutInflater layoutInflater;public MultiplePagerAdapter(Context context, List<Integer> list) {super();this.mList = list;layoutInflater = LayoutInflater.from(context);}@Overridepublic int getCount() {return mList.size();}@Overridepublic boolean isViewFromObject(View view, Object object) {return view == object;}/*** 页面宽度所占ViewPager测量宽度的权重比例,默认为1*/@Overridepublic float getPageWidth(int position) {return (float) 0.8;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {View view = (View) object;((ViewPager) container).removeView(view);}@Overridepublic Object instantiateItem(ViewGroup container, int position) {// 自己实现return null;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

第 2 种表现形式的实现代码

这种效果也好实现,主要的关键点是 android:clipChildren=”false” 这个属性。

1.配置ViewPager 和其父布局的 android:clipChildren属性为”false”. 
(android:clipChildren表示是否限制子View在其范围内,默认为true. 代码设置setClipChildren(false)) 
因为如果clipChildren属性设置为true,就表明我们要将children给clip掉,就是说对于子元素来说,超出当前view的部分都会被切掉,那我们在这里把它设置成false,就表明超出view的部分,不要切掉,依然显示。

注意:setClipChildren(false)在3.0以上版本中,开启了硬件加速后将不能正常工作,所以需要将其设置为软件加速。设置软硬件加速使用 setLayerType(View.LAYER_TYPE_SOFTWARE, null); 也可以在布局文件中添加 android:layerType=”software”

<RelativeLayoutandroid:id="@+id/viewPager_container"android:layout_width="match_parent"android:layout_height="200dp"android:background="@android:color/white"android:clipChildren="false"android:layerType="software"><android.support.v4.view.ViewPagerandroid:id="@+id/viewPager"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginLeft="110dp"android:layout_marginRight="110dp"android:clipChildren="false" />
</RelativeLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

2.设置幕后item的缓存数目。如果一屏展示的pager数目多的话就需要设置此项。

mViewPager.setOffscreenPageLimit(3);  // 具体缓存页数自己订吧
  • 1

3.设置页与页之间的间距

其实我感觉这里是最麻烦的。UI 上是指定了两个pager间距的,而这个调整起来也颇为麻烦。可以通过setPageMargin 来设置,也可以通过ViewPager.的宽高来展示。这里算起来确实要麻烦很多。

mViewPager.setPageMargin(int marginPixls);  // setPageMargin表示设置page之间的间距
  • 1

4.设置滑动,点击事件

如果只是简单的实现滑动,可以用设置viewPager父控件的onTouch监听到ViewPager的监听上。

// 将父类的touch事件分发至viewPgaer,否则只能滑动中间的一个view对象  
findViewById(R.id.relativeLayout).setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {return mViewPager.dispatchTouchEvent(event);}
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

如果要实现点击滑动可以用以下方法(注:代码是我找的demo,效果还不错,是写了个实现类继承自ViewPager。着实当了回代码搬运工…Orz)

public class ClipViewPager extends ViewPager {public ClipViewPager(Context context) {super(context);}public ClipViewPager(Context context, AttributeSet attrs) {super(context, attrs);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {if (ev.getAction() == MotionEvent.ACTION_UP) {View view = viewOfClickOnScreen(ev);if (view != null) {int index = indexOfChild(view);if (getCurrentItem() != index) {setCurrentItem(indexOfChild(view));}}}return super.dispatchTouchEvent(ev);}/*** @param ev* @return*/private View viewOfClickOnScreen(MotionEvent ev) {int childCount = getChildCount();int[] location = new int[2];for (int i = 0; i < childCount; i++) {View v = getChildAt(i);v.getLocationOnScreen(location);int minX = location[0];int minY = getTop();int maxX = location[0] + v.getWidth();int maxY = getBottom();float x = ev.getX();float y = ev.getY();if ((x > minX && x < maxX) && (y > minY && y < maxY)) {return v;}}return null;}

}

这篇关于ViewPager系列之ViewPager一屏显示多个子页面的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071950

相关文章

Python实现合并与拆分多个PDF文档中的指定页

《Python实现合并与拆分多个PDF文档中的指定页》这篇文章主要为大家详细介绍了如何使用Python实现将多个PDF文档中的指定页合并生成新的PDF以及拆分PDF,感兴趣的小伙伴可以参考一下... 安装所需要的库pip install PyPDF2 -i https://pypi.tuna.tsingh

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

MySQL表锁、页面锁和行锁的作用及其优缺点对比分析

《MySQL表锁、页面锁和行锁的作用及其优缺点对比分析》MySQL中的表锁、页面锁和行锁各有特点,适用于不同的场景,表锁锁定整个表,适用于批量操作和MyISAM存储引擎,页面锁锁定数据页,适用于旧版本... 目录1. 表锁(Table Lock)2. 页面锁(Page Lock)3. 行锁(Row Lock

禁止HTML页面滚动的操作方法

《禁止HTML页面滚动的操作方法》:本文主要介绍了三种禁止HTML页面滚动的方法:通过CSS的overflow属性、使用JavaScript的滚动事件监听器以及使用CSS的position:fixed属性,每种方法都有其适用场景和优缺点,详细内容请阅读本文,希望能对你有所帮助... 在前端开发中,禁止htm

Python自动化办公之合并多个Excel

《Python自动化办公之合并多个Excel》在日常的办公自动化工作中,尤其是处理大量数据时,合并多个Excel表格是一个常见且繁琐的任务,下面小编就来为大家介绍一下如何使用Python轻松实现合... 目录为什么选择 python 自动化目标使用 Python 合并多个 Excel 文件安装所需库示例代码

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D