Android 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 .f;//默认值
}
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);
} @Override
public int getCount() {
return mList.size();
} @Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
} /**
* 页面宽度所占ViewPager测量宽度的权重比例,默认为1
*/
@Override
public float getPageWidth(int position) {
return (float) 0.8;
} @Override
public void destroyItem(ViewGroup container, int position, Object object) {
View view = (View) object;
((ViewPager) container).removeView(view);
} @Override
public Object instantiateItem(ViewGroup container, int position) { // 自己实现
return null;
}
}
第 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”
<RelativeLayout
android: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.ViewPager
android: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>
2.设置幕后item的缓存数目。如果一屏展示的pager数目多的话就需要设置此项。
mViewPager.setOffscreenPageLimit(); // 具体缓存页数自己订吧
3.设置页与页之间的间距
其实我感觉这里是最麻烦的。UI 上是指定了两个pager间距的,而这个调整起来也颇为麻烦。可以通过setPageMargin 来设置,也可以通过ViewPager.的宽高来展示。这里算起来确实要麻烦很多。
mViewPager.setPageMargin(int marginPixls); // setPageMargin表示设置page之间的间距
4.设置滑动,点击事件
如果只是简单的实现滑动,可以用设置viewPager父控件的onTouch监听到ViewPager的监听上。
// 将父类的touch事件分发至viewPgaer,否则只能滑动中间的一个view对象
findViewById(R.id.relativeLayout).setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return mViewPager.dispatchTouchEvent(event);
}
});
如果要实现点击滑动可以用以下方法(注:代码是我找的demo,效果还不错,是写了个实现类继承自ViewPager。着实当了回代码搬运工…Orz)
ublic class ClipViewPager extends ViewPager { public ClipViewPager(Context context) {
super(context);
} public ClipViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
} @Override
public 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[];
for (int i = ; i < childCount; i++) {
View v = getChildAt(i);
v.getLocationOnScreen(location); int minX = location[];
int minY = getTop(); int maxX = location[] + 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;
}
}
Android ViewPager系列之ViewPager一屏显示多个子页面的更多相关文章
- 【转】ViewPager 一屏显示多个子页面
一.概述 项目中遇到一个需求:ViewPager 一屏显示多个子页面.因为之前没有做过这样的界面,所以经历了些许小插曲,特以记之! 主要内容来自: http://blog.csdn.net/JM_be ...
- android启动画面隐藏状态栏全屏显示
1.在根部局给一个id,然后直接设置就行了layout.setSystemUiVisibility(View.INVISIBLE); 状态栏就没有了. 2.如果你只是想改变状态栏颜色的也可以 //5. ...
- Android Activity 去掉标题栏及全屏显示
默认生成的活动(Activity)界面中包含标题栏,并带有状态栏.有时不需要这两个控件. 1.去掉标题栏 (三种方法) a:在setContentView()方法前 添加:requestWindowF ...
- Android 横屏不让输入法全屏显示
记录学习之用 查找资料参考记录的 在源码里进行修改. frameworks/base/core/Java/Android/inputmethodservice/InputMethodService. ...
- Android listView如何判断数据多屏显示 (2012-03-06 09:47:04)
@Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int tot ...
- Android系统的三种分屏显示模式
Google在Android 7.0中引入了一个新特性——多窗口支持,允许用户一次在屏幕上打开两个应用.在手持设备上,两个应用可以在"分屏"模式中左右并排或上下并排显示.在电视设备 ...
- ViewPager一屏显示多个item,及边缘滑动事件优化
关于ViewPager显示两边的item方法,网络上是方法都在ViewPager外包一个Layout, 然后设置ViewPager和外面的Layout的clipChildren="false ...
- Android 画廊效果之ViewPager显示多个图片
首先来看下面的效果: 从上面的图片可以看到,当添加多张图片的时候,能够在下方形成一个画廊的效果,我们左右拉动图片来看我们添加进去的图片,效果是不是好了很多呢?下面来看看怎么实现吧! 上面的效果类似An ...
- Android MagicIndicator系列之一 —— 使用MagicIndicator打造千变万化的ViewPager指示器
说到 ViewPager 指示器,想必大家都不陌生,绝大部分应用中都有这个.使用频率非常之高.但系统对它的支持并不好,自带的 PagerTabStrip 和 PagerTitleStrip 太弱,很难 ...
随机推荐
- JavaScript设计模式学习——builder pattern(建造者模式)
个人理解的应用场景 举个例子,比如想要创建各种类型的车的实例,车的类型有很多种,但创建每种类型车的接口定义可能是一样的,就用到了此模式 相关概念的通俗解释 上述例子中接口的定义叫builder 接口到 ...
- heavy dark--读《《暗时间》》
本书名为<<暗时间>>,个人觉得是一个非常好的名字:1.迷茫的大学生有多少的业余时间,但又浪费多少的业余时间,浪费的这莫多时间就如同人在黑夜中一样,大脑是在休息的状态.这是第一 ...
- 任何抛开业务谈大数据量的sql优化都是瞎扯
周三去某在线旅游公司面试.被问到了一个关于数据量大的优化问题.问题是:一个主外键关联表,主表有一百万数据,外键关联表有一千万的数据,要求做一个连接. 本人接触过单表数据量最大的就是将近两亿行历史数据( ...
- Django框架详解之views
一个简单的视图 一个视图函数,是一个简单的python函数,它接受web请求并且返回web响应.无论视图本身包含什么逻辑,都要返回响应.为了将代码放在某处,约定是将视图放置在项目或应用程序目录中的名为 ...
- BZOJ4545: DQS的trie 广义后缀自动机_LCT
特别鸣神犇 fcwww 替我调出了无数个错误(没他的话我都快自闭了),祝大佬省选rp++ 板子题,给我写了一天QAQ...... 用 LCT 维护后缀树,暴力更新用 LCT 区间更新链即可 其实,在计 ...
- java+jxls利用excel模版进行导出
大多时候会出现需要导出excel的功能,利用poi可以实现简单的导出,可以说poi的功能非常强大可以做到细节的定制化操作,但相对于在office操作excel,利用poi完全生成excel会显得非常复 ...
- echarts的下载为excel小工具
echarts自带有下载为图片的功能,但是没有下载为excel表格的功能,个人觉得下载为表格更为需要,所以写了个工具,此工具应用有局限性,只能用于柱形图和折线图,option的series要是如下形式 ...
- es6——Proxy和Reflect
Proxy代理,Reflect反射 Proxy对属性的读取 { //供应商,原始对象 let obj={ time:'2017-1-1', name:'net', _r:123 } //代理商,新生成 ...
- 密信(MeSince),将取代传统电子邮件
电子邮件发展至今已经有几十年的历史,但仍然是最重要的现代互联网应用之一.在全球范围内,每小时发送的非垃圾邮件数量超过30亿封,从工作场景的使用到个人生活,电子邮件都扮演着不可或缺的角色.但是由于明文电 ...
- IOS - 网络指示器
#pragma mark Activity methods - (void)openActivity { // 添加网络指示器 activityIV = [[UIActivityIndicatorVi ...