from :http://blog.csdn.net/JM_beizi/article/details/51297605

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
  • 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
  • 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

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

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

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

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

mViewPager.setPageMargin(int marginPixls);  // setPageMargin表示设置page之间的间距
  • 1
  • 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
  • 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一屏显示多个子页面相关推荐

  1. html中iframe显示多个子页面

    html中iframe显示多个子页面 参考:https://www.runoob.com/html/html-iframes.html go.html <!DOCTYPE html> &l ...

  2. js 全屏显示和关闭页面

    js使ie全屏显示(转) 文章分类:Web前端 第一种: 在已经打开的一个普通网页上,点击"全屏显示",然后进入该网页对应的全屏模式.方法为:在网页的<body>与&l ...

  3. ViewPager系列之ViewPager无限循环滑动

    目前ViewPager实现无限循环有2种方法,直接上具体方法: 方法1:重写 PagerAdapter 中的 getCount() 方法.其实只是在计算item 数目的时候给了一个很大的数,然后通过调 ...

  4. 苹果iPhone 13系列有望支持息屏显示

    Mark Gurman 在今天的Power On专栏中谈到了全新的 iPhone 13(或 12s系列,现距离下一代 iPhone 发布还有不到2个月的时间. Gurman预测,iPhone 13 系 ...

  5. uniapp 背景图片全屏显示在整个页面

    要让uniapp中的背景图片全屏,可以在<style>标签中添加以下样式: page {background-image: url('/static/bg.jpg');background ...

  6. html中iframe全屏显示,如何让iframe中的元素全屏

    最近项目中iframe让人恶心,iframe只要一出现,写的正常代码就容易出现各种bug,比如iframe中的元素不能document.getElementBy...正常获取,比如iframe中的元素 ...

  7. ViewPager一屏显示多个item,及边缘滑动事件优化

    关于ViewPager显示两边的item方法,网络上是方法都在ViewPager外包一个Layout, 然后设置ViewPager和外面的Layout的clipChildren="false ...

  8. Android进阶篇之引导页系列之ViewPager实现Animation动画引导页

    Android进阶篇之引导页系列之ViewPager实现Animation动画引导页 转载于:https://www.cnblogs.com/zhujiabin/p/5795789.html

  9. android左右滑动fragment,Android基于ViewPager+Fragment实现左右滑屏效果的方法

    本文实例讲述了Android基于ViewPager+Fragment实现左右滑屏效果的方法.分享给大家供大家参考,具体如下: 1.xml布局模板 android:id="@+id/local ...

最新文章

  1. iReport报表工具的使用
  2. redis 集群_Redis集群管理
  3. (十八)密度聚类DBSCAN
  4. 本地VM安装虚拟机,使用xshell连接
  5. .net创建XML文件的两种方法
  6. 微星主板 新版bios 开启虚拟化
  7. 分页插件之--kaminari
  8. AndroidQ(十)Android Q功能和API
  9. 2019.07.一年级暑假——自动随机生成100以内加减法算术题的python实现
  10. 安装了yarn还是有 The project seems to require yarn but it‘s not installed
  11. kali_上传_腾讯云_搭建kali
  12. CKP.CMP工作原理===
  13. SQL中的聚合函数介绍
  14. shell里面的jq
  15. 网易易盾反作弊实践:如何抵御烦人的羊毛党?
  16. ocr 图像倾斜矫正-霍夫变换
  17. [周更]4.unity3D_Roll_a_Ball
  18. 为什么是web墨卡托投影
  19. Unity插件之TextMeshPro 富文本
  20. npm scripts中run serve命令详解

热门文章

  1. 3 - 组合逻辑代码设计和仿真
  2. 爬虫-Webpack逆向实战 有习题
  3. 流量主系列|独立版在线答题微信小程序源码
  4. 标定代码:Tsai两步标定法(matlab)
  5. 在 CentOS 上安装 CPU 温度监控软件(lm_sensors)
  6. Jupyter Notebook安装代码提示、自动生成目录功能nbextensions
  7. R G B 常用颜色列表
  8. 阿里云ECS经典网络访问专有网络的私有IP无法访问
  9. leetcode 231. Power of Two 判断是否为2的幂 Java
  10. 杭州创新创业大赛人才引进政策