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

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器