Android中View的基础知识
View的界限
View就是我们看到的界面,有四个界限范围分别是, Top/Left, Bottom/Right,坐标系从左上到右下。这四个值可以通过任何View的子类调用getTop()/get...得到。
但是坑爹的是这些不能在生命周期函数里调用,否则都返回0,因为绘制还没完成呢,可以放在button的onclicklistener中。
事件的种类
分为MotionEvent和TouchSlop,分为ACTION_DOWN, ACTION_MOVE, ACTION_UP。
MotionEvent是点击之后的event可以通过getX()/getY()/getRawX()/getRawY()来得到点击的位置,区别是一个是相对当前View的,一个是相对手机屏幕左上角的。
TouchSlop是系统能识别出的最小滑动距离。可以通过
VelocityTracker用开跟踪划动过程中的速度
GestureDetector用来检测用户的单击、滑动、长按、双击行为。
Scroller用来弹性滑动对象。
划动的方式
划动的方式主要有3中,分别是通过View本身提供的scrollTo/scrollBy方法。第二种是通过动画给View施加平移效果。第三种是通过改变view的LayoutParams使得View重新布局从而实现滑动。
第一种,scrollTo/scrollBy只是改变View的内容而不是View本身的位置,View本身的位置是不变的(getScrollX是改变的,但是getTop/getLeft/getBottom/getRight不变)。
有点是操作简单,适合对View的内容进行滑动。
第二种是动画,优点是操作简单,适用于没有交互的view和实现复杂的动画效果。
第三种是改变布局参数,优点是适用于有交互的View,缺点是操作稍微复杂。
事件分发机制
点击事件的分发就是对MotionEvent事件的分发过程,由三个主要的方法共同完成:dispatchTouchEvent(), onInterceptTouchEvent(), onTouchEvent()
只要点击事件传递到了当前view,dispatchTouchEvent方法一定会被调用他们之间的关系可以用下图表示:
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
boolean consume = false;
if (onInterceptTouchEvent(event)){
consume = onTouchEvent(event);
} else {
consume = child.dispatchTouchEvent(event);
}
return consume;
}
对于ViewLayout来说,处理的顺序是:
MainActivity-dispatchTouchEvent-ACTION_DOWN
CustomLayout-dispatchTouchEvent-ACTION_DOWN
CustomLayout-onInterceptTouchEvent-ACTION_DOWN
CustomButton-dispatchTouchEvent-ACTION_DOWN
CustomButton-onTouch-ACTION_DOWN
CustomButton-onTouchEvent-ACTION_DOWN
MainActivity-dispatchTouchEvent-ACTION_UP
CustomLayout-dispatchTouchEvent-ACTION_UP
CustomLayout-onInterceptTouchEvent-ACTION_UP
CustomButton-dispatchTouchEvent-ACTION_UP
CustomButton-onTouch-ACTION_UP
CustomButton-onTouchEvent-ACTION_UP
CustomButton--onClick
对View来说,处理的顺序是:
MainActivity-dispatchTouchEvent-ACTION_DOWN
CustomButton-dispatchTouchEvent-ACTION_DOWN
CustomButton-onTouch-ACTION_DOWN
CustomButton-onTouchEvent-ACTION_DOWN
MainActivity-dispatchTouchEvent-ACTION_UP
CustomButton-dispatchTouchEvent-ACTION_UP
CustomButton-onTouch-ACTION_UP
CustomButton-onTouchEvent-ACTION_UP
CustomButton--onClick
详情请参考:http://blog.csdn.net/lanhuzi9999/article/details/26515421
Android中View的基础知识的更多相关文章
- Android中的一些基础知识(三)
最近在回顾Android的基础知识,就把一些常见的知识点整理一下,以后忘了也可以翻出来看一看. 在TextView中显示图像(使用< img>标签) 在TextView中显示图片的方法有许 ...
- Android中的一些基础知识(二)
这几天在回顾Android的基础知识,就把一些常见的知识点整理一下,以后忘了也可以翻出来看一看. 简单介绍一下Activity的生命周期 在API文档中对生命周期回调的函数描述的很详细,这里我只是翻译 ...
- Android中的一些基础知识(一)
翻译自这里,并做了部分修改. 什么是Android? Android是为移动设备提供的软件,它包括操作系统.中间件.和一些关键的应用程序.应用程序执行它自己的进程和在Dalvik虚拟机中的实例. An ...
- Android中View绘制流程以及invalidate()等相关方法分析
[原文]http://blog.csdn.net/qinjuning 整个View树的绘图流程是在ViewRoot.java类的performTraversals()函数展开的,该函数做的执行过程可简 ...
- Android中View绘制流程以及invalidate()等相关方法分析(转载的文章,出处在正文已表明)
转载请注明出处:http://blog.csdn.net/qinjuning 前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时 ...
- Android中View绘制流程以及invalidate()等相关方法分析(转)
转自:http://blog.csdn.net/qinjuning 前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时真挚地向渴 ...
- 源码解析Android中View的measure量算过程
Android中的Veiw从内存中到呈现在UI界面上需要依次经历三个阶段:量算 -> 布局 -> 绘图,关于View的量算.布局.绘图的总体机制可参见博文< Android中View ...
- 【转】Android中View的绘制过程 onMeasure方法简述 附有自定义View例子
Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android framework将会处理绘制过程,Activity只需提供它的布局的根节点. 绘制过程从布 ...
- Android中Canvas绘图基础详解(附源码下载) (转)
Android中Canvas绘图基础详解(附源码下载) 原文链接 http://blog.csdn.net/iispring/article/details/49770651 AndroidCa ...
随机推荐
- centos 6.4 升级python到版本2.7.12
注意:需要root权限 查看python版本:python --version 1.下载Python-2.7.12wget https://www.python.org/ftp/python/2.7. ...
- Windows下的Memcache安装
Windows下的Memcache安装: 1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached2. 在终端(也即cmd命令界面)下输入 'c:\memca ...
- JAVA 1.3 (原生数据类型 Primitive Data Type)续
1. 原生数据类型一共有4类8种 >> 整数类型 int表示一个int代表32位 2^32(-2147483648 - 2147483647) >> 字符类型 byte 表示一 ...
- 数据格式json讲解
JSON 在使用名称/值对或XML时,实际上是使用javascript从应用程序中取得数据并将数据转换成另一种数据格式.javascript不仅作为格式化语言使用,还可以使用javascript语言中 ...
- JSON,Bean,XML,List,Map
http://blog.csdn.net/superit401/article/details/51728929 JSON-lib这个Java类包用于把bean,map和XML转换成JSON并能够把J ...
- DBUnit的一些注意事项
DatabaseOperation.TRUNCATE_TABLE.execute(con, ds);等对数据库的操作放在每个@Test方法中做而不是在@Before里做,可增加灵活性
- spring框架学习(二)依赖注入
spring框架为我们提供了三种注入方式,分别是set注入,构造方法注入,接口注入.接口注入不作要求,下面介绍前两种方式. 1,set注入 采用属性的set方法进行初始化,就成为set注入. 1)给普 ...
- 在object,embed上添加跳转链接(视频上添加跳转)
今天遇到个问题,就是在视频上添加跳转链接时,谷歌浏览器能正常跳转,但是ie下,却无效,视频使用object引入,<a>标签跟随其后采用绝对定位,和平时的图片加跳转操作一样.原来是需要加上& ...
- yii2-basic后台管理功能开发之五:用户权限的控制
需求:后台有两种权限+管理员+用户 区别:可以访问的页面不同 解决方法:用户表添加role字段,使用到的是yii2 存取控制过滤器(ACF)方法. >1在web.php中配置授权的类,有两种,我 ...
- linux下tomcat的shutdown命令杀不死进程
tomcat在windows下可以直接关闭,但是貌似在Linux下有时候shutdown.sh 没有关闭tomcat进程:国庆前最后一天没事,解决你~~~~ 现象: 在Linux下shutdown.s ...