第一部分:自定义ViewGroup的使用,手势识别器和Scroller滑动

第二部分:处理滑动监听,处理滑动冲突,增加ViewPager的指示器

 

常见的滑动冲突:外部滑动方向和内部滑动方向不一致、外部滑动方向和内部滑动方向一致。

我们自定义的ViewPager如果在其中一页中存在ListView,那么就需要解决滑动冲突的问题。

由于系统自带ViewPager中,自己已经解决了滑动冲突。

 

1、创建一个类,继承ViewGroup,由于ViewPager里面包含多个子View,所以继承这个类,实现onLayout方法

onLayout:这个方法是对我们该View的一个位置摆放,这里可以看到onLayout这(int l,int t,int r,int b)这四个参数,分别代表着这个ViewPager的左上右下的位置,由于你引用ViewPager是match_parent,所以l和t为0,r和b为宽和高的距离


2、我们在自己的Activity中引用自定义的这个组件


3、复制几张图片作为演示,并为他们创建Id数组


4、接着我们需要对图片进行初始化,并加入到ViewPager中,我们写个初始化方法,并将他们放在构造方法中


5、这个时候,启动程序,你是看不到有图片出现的,因为你还没有对这几张图片进行位置的摆放,所以需要在onLayout中进行位置处理


这样处理的好处就是将图片一字排开


6、现在已经排好了图片,接着我们就来处理滑动事件了,我们通过一个手势识别器自动帮我们识别滑动事件



通过onTouchEvent委托给手势识别器,并且返回true,让这个控件消耗这个事件


这个时候我们就可以看下效果图

7、我们看到跟ViewPager还差一点,就是滑到第几张就自动复原和不能超出头和尾部的图片,这时就要处理滑动事件了


效果图

8、基本效果已经出来了,就是没有很自然的滑动过去,那么这个时候就要用到scroller了




可以将ScrollTo替换掉了,让它自然滑动



使用invalidate这个方法会有执行一个回调方法computeScroll,我们来重写这个方法



其实Scroller的原理就是用ScrollTo来一段一段的进行,最后看上去跟自然的一样,必须使用postInvalidate,这样才会一直回调computeScroll这个方法,直到滑动结束。基本上ViewPager的效果就出来了,看下效果图:



以下是这一部分的整个类的源码



 

1、接下来介绍指示器的完成,指示器用RadioButton来实现,在xml中编写RadioGroup


2、在主页面中对RadioButton初始化


3、回到我们的MyViewPager类,创建ViewPager的监听事件接口


4、创建ViewPager设置页面的方法,并调用接口的onPagerChange方法


这个时候,滑动事件处理就可以用setCurrentItem方法来替代


5、回到Activity中进行绑定事件


这样就完成了切换效果,看效果图



 

1、我们在ViewPager中嵌套一个ScrollView作为它的子View,这样ViewPager是左右滑动,ScrollView是上下滑动,那么就造成了滑动冲突

创建一个ScrollView的xml文件


2、在主界面中添加这个页面到ViewPager中,同时增加一个RadioButton


这个时候你可以看到增加了一个页面,但是页面是空白的:由于ViewGroup只遍历它的一个子View(即在这里的ScrollView),并不会去遍历ScrollView里面的内容,所以必须重写它的onMeasure方法,对ScrollView的子View进行遍历


查看效果图


这个时候你会发现这个页面只能上下滑动不能左右滑动,所以需要处理滑动事件冲突

3、重写父控件的onInterceptTouchEvent方法,如果是左右滑动,苏越我们的父控件就把滑动事件拦截下来


这个时候还需要把将ACTION_DOWN传递给手势识别器,因为拦截了MOVE的事件后,DOWN的事件也要给拦截给手势识别器,否则会丢失事件


到现在,ViewPager就完成了滑动冲突的处理,既能上下滑动和左右滑动

Android自定义View——自定义ViewPager的更多相关文章

  1. Android自定义View——自定义搜索框(SearchView)

    Android自定义View——自定义搜索框(SearchView) http://www.apkbus.com/android-142064-1-1.html

  2. Android 自定义View——自定义点击事件

    每个人手机上都有通讯录,这是毫无疑问的,我们通讯录上有一个控件,在通讯录的最左边有一列从”#”到”Z”的字母,我们通过滑动或点击指定的字母来确定联系人的位置,进而找到联系人.我们这一节就通过开发这个控 ...

  3. android自定义View&自定义ViewGroup(上)

    一般自定义view需要重写的方法 void onMeasure(int widthMeasureSpec, int heightMeasureSpec) void onSizeChanged(int ...

  4. Android——ViewPager滑动背景渐变(自定义view,ViewPager)

    效果: ActivityBackgroundImage,java(自定义视图) package com.example.chenshuai.test322; import android.conten ...

  5. 自定义view(自定义view的时候,三个构造函数各自的作用)

    package com.timeshare.tmband.Utils; import android.content.Context; import android.content.res.Typed ...

  6. Android查缺补漏(View篇)--自定义 View 的基本流程

    View是Android很重要的一部分,常用的View有Button.TextView.EditView.ListView.GridView.各种layout等等,开发者通过对这些View的各种组合以 ...

  7. 【Android 应用开发】自定义View 和 ViewGroup

    一. 自定义View介绍 自定义View时, 继承View基类, 并实现其中的一些方法. (1) ~ (2) 方法与构造相关 (3) ~ (5) 方法与组件大小位置相关 (6) ~ (9) 方法与触摸 ...

  8. 自定义View系列教程08--滑动冲突的产生及其处理

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...

  9. 推翻自己和过往,重学自定义View

    http://blog.csdn.net/lfdfhl/article/details/51671038 深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 A ...

随机推荐

  1. gitlab clone或者pull 仓库

    今天在学git操作,想从gitlab上面clone下来并操作一下,但是一直出现 没有权限的错误,一直搞不定 后来才知道,需要ssh密钥才可以 ssh-keygen -t rsa -C "ex ...

  2. NO18 linux开机自启动设置--开机流程--中文乱码--查看行数

    第八题:装完系统后,希望让网络文件共享服务NES,仅在3级别上开机自启动,该如何做? 解答:什么是开机自启动,在Linux下软件服务随系统启动而启动的配置. 方法一:文件配置法,可以把要启动的服务的命 ...

  3. ModelSim安装步骤

    刚成功安装了软件的我反手就是一篇安装步骤分享. 这是我自己创建的永久百度云链接. ModelSim10.7软件下载百度云链接 网址:https://pan.baidu.com/s/14oGZytocA ...

  4. 题目:给定一数组 例如:a = [1,2,3,5,2,1] 现用户提供一个数字 请返回用户所提供的数字的所有下标

    def test(ary): ds = {} for i in range(len(ary)): if ds.get(ary[i]): ds[ary[i]].append(i) else: ds[ar ...

  5. java.jvm调优

    _amazing~ 基本: 整理:

  6. 在命令提示符中运行install adb 包名.apk文件 遇到的问题

    昨天更新了SDK以后遇到一个奇怪的问题,使用eclipse直接运行程序到手机没有问题,但是如果将程序打包之后在命令提示符中执行adb install 包名.apk 就会报错:adb server is ...

  7. 15.Pythonic与python杂记

    switcher ={ :'sunday', :'monday', :'thuesday' } day = day_name=switcher.get(day,'Unknow') print(day_ ...

  8. WinForm_UI设计

    下载

  9. Essay写作:Conclusion部分写作辅导

    论文写到最后,一般正文就要以Conclusion结束了.Conclusion部分是一篇论文的正文结尾(the last section of a paper,last paragraph),主要是客观 ...

  10. redis学习(五)

    一.Redis 发布订阅 1.Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 2.Redis 客户端可以订阅任意数量的频道. 比如你订阅 ...