【Android 界面效果45】ViewPager源码分析
ViewPager概述:
Layout manager that allows the user to flip left and right through pages of data. You supply an implementation of a PagerAdapter to generate the pages that the view shows.
Note this class is currently under early design and development. The API will likely change in later updates of the compatibility library, requiring changes to the source code of apps when they are compiled against the newer version.
ViewPager is most often used in conjunction with android.app.Fragment, which is a convenient way to supply and manage the lifecycle of each page. There are standard adapters implemented for using fragments with the ViewPager, which cover the most common use cases. These are android.support.v4.app.FragmentPagerAdapter and android.support.v4.app.FragmentStatePagerAdapter; each of these classes have simple code showing how to build a full user interface with them.
Here is a more complicated example of ViewPager, using it in conjuction with android.app.ActionBar tabs. You can find other examples of using ViewPager in the API 4+ Support Demos and API 13+ Support Demos sample code.
{@sample development/samples/Support13Demos/src/com/example/android/supportv13/app/ActionBarTabsPager.java complete}
布局管理器允许用户通过左右滑动的方式浏览数据页面。开发者需要提供产生这些页面的数据适配器---实现PagerAdapter。
值得注意的是,ViewPager这个类目前仍在前期设计和开发阶段,它在今后的兼容包中有可能更新,如果ViewPager在编译时与更新版本冲突就需要修改它的源码。
ViewPager通常与Fragment结合使用,这样可以方便有效的管理各个页面的生命周期。为了让Fragment和ViewPager结合使用,已经有了概含最常见的用例的标准适配器:FragmentPagerAdapter和FragmentStatePagerAdapter.这两个类都是PagerAdapter的子类,都有一些简单的代码来展示如何用他们来创建一个完整的用户接口。
ViewPager有一个更复杂的例子,使用它与ActionBar的tab结合使用。可以在v4和v13支持库的示例代码中找到其他和ViewPager有关的例子。(路径为:development/samples/Support13Demos/src/com/example/android/supportv13/app/ActionBarTabsPager.java)
Support13Demos源码下载:http://download.csdn.net/detail/dongdong230/8440129
Support13Demos源码下载:http://download.csdn.net/detail/dongdong230/8440129
ViewPager方法精选:
1.Viewpager继承ViewGroup,需重写其抽象方法OnLayout:
protected void onLayout (boolean changed, int l, int t, int r, int b)
调用场景:在view给其孩子设置尺寸和位置时被调用。子view,包括孩子在内,必须重写onLayout(boolean, int, int, int, int)方法,并且调用各自的layout(int, int, int, int)方法
几个参数的含义:
| changed | view有新的尺寸或位置 |
|---|---|
| l | 相对于父view的Left位置 |
| t | 相对于父view的Top位置 |
| r | 相对于父view的Right位置 |
| b | 相对于父view的Bottom位置 |
这里分别对decor view 和 非decor view进行位置移动,依据是srollx及offset。
2.ViewPager的内部类:LayoutParams:
Layout parameters that should be supplied for views added to a ViewPager。
这是为viewpager页面子view准备的布局参数类。
其中的几个重要字段:
| isDecor | true:该view是pager自身的而非适配器适配的 |
|---|---|
| gravity | 仅为decor view使用,布局子view的位置,常量值在android.view.Gravity中 |
| widthFactor | 页面宽度的乘数因子? |
| needsMeasure | true:该view在正layout时被添加,且在布局这个view前需测量 |
| position | 非decorview的view所适配的位置 |
3.ViewPager重要接口OnPageChangeListener:
三个未实现的方法:onPageScrolled、onPageSelected、onPageScrollStateChanged
最常用接口,无需多说。
另有内部类SimpleOnPageChangeListener:实现了OnPageChangeListener方法,但没有写实现代码,如果不想重写OnPageChangeListener所有方法,使用这个内部类即可。
4.滑动动画接口:PageTransformer:页面滑动时所展现的动画效果
transformPage:给指定页面添加滑动动画
5.其他方法
- addFocusables:当前显示的页面方可获取焦点
- addTouchables:当前显示的页面方可获取触摸事件
- addView:根据指定布局参数添加子view
- arrowScroll:滑动的方向?
- beginFakeDrag:开始控制滑动事件,处于fake drag时,viewpager会忽略掉touch事件
- canScrollHorizontally:判断view是否可在指定方向(derection)上水平滑动.derection:负数代表向左,正数代表向右
- computeScroll:由父类调用,计算其子类所应滑动的距离
- dispatchKeyEvent:分发key事件
- dispatchPopulateAccessibilityEvent:分发辅助事件给view,然后将其子类的text content添加到这个事件中。
- draw:绘制view及其子view到canvas上。
- endFakeDrag:结束控制滑动事件
- executeKeyEvent:执行key事件
【Android 界面效果45】ViewPager源码分析的更多相关文章
- Android Small插件化框架源码分析
Android Small插件化框架源码分析 目录 概述 Small如何使用 插件加载流程 待改进的地方 一.概述 Small是一个写得非常简洁的插件化框架,工程源码位置:https://github ...
- ViewPager 源码分析(一) —— setAdapter() 与 populate()
写在前面 做安卓也有一定时间了,虽然常用控件都已大致掌握,然而随着 Android N 的发布,不自觉的愈发焦虑起来.说来惭愧,Android L 的 Material Design 库里的许多控件都 ...
- ViewPager源码分析——滑动切换页面处理过程
上周客户反馈Contacts快速滑动界面切换tab有明显卡顿,让优化. 自己验证又没发现卡顿现象,但总得给客户一个技术性的回复,于是看了一下ViewPager源码中处理滑动切换tab的过程. View ...
- Android View事件分发-从源码分析
View事件分发-从源码分析 学习自 <Android开发艺术探索> https://blog.csdn.net/qian520ao/article/details/78555397?lo ...
- Android JobService的使用及源码分析
Google在Android 5.0中引入JobScheduler来执行一些需要满足特定条件但不紧急的后台任务,APP利用JobScheduler来执行这些特殊的后台任务时来减少电量的消耗.本文首先介 ...
- 【Android】Handler、Looper源码分析
一.前言 源码分析使用的版本是 4.4.2_r1. Handler和Looper的入门知识以及讲解可以参考我的另外一篇博客:Android Handler机制 简单而言:Handler和Looper是 ...
- Android线程间异步通信机制源码分析
本文首先从整体架构分析了Android整个线程间消息传递机制,然后从源码角度介绍了各个组件的作用和完成的任务.文中并未对基础概念进行介绍,关于threadLacal和垃圾回收等等机制请自行研究. 基础 ...
- Android 7.0 Gallery图库源码分析3 - 数据加载及显示流程
前面分析Gallery启动流程时,说了传给DataManager的data的key是AlbumSetPage.KEY_MEDIA_PATH,value值,是”/combo/{/local/all,/p ...
- Android服务之PackageManagerService启动源码分析
了解了Android系统的启动过程的读者应该知道,Android的所有Java服务都是通过SystemServer进程启动的,并且驻留在SystemServer进程中.SystemServer进程在启 ...
随机推荐
- ThinkPad X200s 安装 Mac OSX
===================先说一下注意事项================== 无论任何安装方法(U盘.光盘)不能进入安装界面,或者鼠标无法移动.那就在变色龙引导界面加入以下代码 cpus ...
- ACM之数学题
数学题,始终记得,第一次被带飞师大校赛以及省赛,毫无例外的在数学题上卡死....因此,现在开始,有意识的保留遇见的数学题...(下列知识点按遇见先后顺序排列: 1欧拉公式 欧拉公式的用处是,找出小于N ...
- URAL 2068 Game of Nuts (博弈)
题意:给定 n 堆石子,每次一个人把它们分成三堆都是奇数的,谁先不能分,谁输. 析:因为每堆都是奇数,那么最后肯定都是要分成1的,那么就把不是1的全加和,然后判断奇偶就OK了. 代码如下: #prag ...
- springMVC在jsp传对象到后台
==============实体entity======================= package com.jb.pub.entity; import java.io.Serializable ...
- (剑指Offer)面试题19:二叉树的镜像
题目: 操作给定的二叉树,将其变换为源二叉树的镜像. 二叉树的定义如下: struct TreeNode{ int val; TreeNode* left; TreeNode* right; }; 输 ...
- cocos2d-x 2.2 资源更新AssetsManager例子代码
转自:http://www.58player.com/blog-2327-601.html // // UpgradeLayer.h // AmazeDemo // // Created by lsw ...
- js中的this和apply
this是js的一个关键字,随着函数使用场合不同,this的值会发生变化.但是总有一个原则,那就是this指的是调用函数的那个对象. 1.纯粹函数调用. function test() { this. ...
- 由实现JavaScript中的Map想到的
项目中要用到JavaScript中的Map数据类型,它不像JDK那样有自带的,怎么办?搜了找到一个不错的(http://darkmasky.iteye.com/blog/454749).用这个可以满足 ...
- UIBezierPathStudyDemo
import UIKit import XCPlayground //创建view let myView = UIView(frame:CGRectMake(0, 0, 300, 200)) //实时 ...
- ls显示文件大小时显示单位
在Linux中显示文件大小的时候,通常的做法是使用“ls -l”,显示的大小是文件的字节大小. 但是,如果文件比较大的话,显示起来不是特别易读,这个时候,可以使用“ls -lh”,就可以使用比较接近文 ...