Android自定义View——自定义ViewPager
第一部分:自定义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的更多相关文章
- Android自定义View——自定义搜索框(SearchView)
Android自定义View——自定义搜索框(SearchView) http://www.apkbus.com/android-142064-1-1.html
- Android 自定义View——自定义点击事件
每个人手机上都有通讯录,这是毫无疑问的,我们通讯录上有一个控件,在通讯录的最左边有一列从”#”到”Z”的字母,我们通过滑动或点击指定的字母来确定联系人的位置,进而找到联系人.我们这一节就通过开发这个控 ...
- android自定义View&自定义ViewGroup(上)
一般自定义view需要重写的方法 void onMeasure(int widthMeasureSpec, int heightMeasureSpec) void onSizeChanged(int ...
- Android——ViewPager滑动背景渐变(自定义view,ViewPager)
效果: ActivityBackgroundImage,java(自定义视图) package com.example.chenshuai.test322; import android.conten ...
- 自定义view(自定义view的时候,三个构造函数各自的作用)
package com.timeshare.tmband.Utils; import android.content.Context; import android.content.res.Typed ...
- Android查缺补漏(View篇)--自定义 View 的基本流程
View是Android很重要的一部分,常用的View有Button.TextView.EditView.ListView.GridView.各种layout等等,开发者通过对这些View的各种组合以 ...
- 【Android 应用开发】自定义View 和 ViewGroup
一. 自定义View介绍 自定义View时, 继承View基类, 并实现其中的一些方法. (1) ~ (2) 方法与构造相关 (3) ~ (5) 方法与组件大小位置相关 (6) ~ (9) 方法与触摸 ...
- 自定义View系列教程08--滑动冲突的产生及其处理
深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...
- 推翻自己和过往,重学自定义View
http://blog.csdn.net/lfdfhl/article/details/51671038 深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 A ...
随机推荐
- Matplotlib 饼图
章节 Matplotlib 安装 Matplotlib 入门 Matplotlib 基本概念 Matplotlib 图形绘制 Matplotlib 多个图形 Matplotlib 其他类型图形 Mat ...
- Kubernetes Dashboard 【转】
前面章节 Kubernetes 所有的操作我们都是通过命令行工具 kubectl 完成的.为了提供更丰富的用户体验,Kubernetes 还开发了一个基于 Web 的 Dashboard,用户可以用 ...
- vs2010编译C++ 结构体
//结构体的测试// CTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> usi ...
- Http与Https协议规范
HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1.0的第 ...
- SDOI 种田记
day3: 今天早上来重新看了一下,IQ--,智障的感觉2333.弱势围观了一发众神奔,发现好多人都A了第三题,然而回想起自己考试的时候傻傻的码第二题的错误代码,真的是感觉mdzz. 不想吐槽了,记得 ...
- JS:递归基础及范例——斐波那契数列 、 杨辉三角
定义:程序调用自身的编程技巧称为递归.一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就 ...
- OLTP和OLAP区别详解
Oracle属于OLTP类型,而gp数据库属于OLAP类型的.具体了解如下: 数据库系统一般分为两种类型,一种是面向前台应用的,应用比较简单,但是重吞吐和高并发的OLTP类型:一种是重计算的,对大数据 ...
- [转]SparkSQL – 有必要坐下来聊聊Join
转载自网易范欣欣http://hbasefly.com Join背景介绍 Join是数据库查询永远绕不开的话题,传统查询SQL技术总体可以分为简单操作(过滤操作-where.排序操作-limit等), ...
- java分词技术(自动提取关键词,段落大意)hanlp
这是老师大作业需要的技术才知道hanlp这个外部包 使用方法 包以及数据如下GIT下载很慢我传百度云了 链接:https://pan.baidu.com/s/14a22v1g_CAQN-G-k8 ...
- centos下安装tomcat8.
一.tomcat安装之前,首先安装java jdk,所以手首先将相关安装包都下载传到虚拟机上 1.下载java的linux----jdk1.8安装 到官网上下载与本虚拟机版本位相适应的位节数的Linu ...