以下如无特别说明,所有的方法说明均是以实线黄色矩形作为参照。
getX()/getY()获取的是其左上角相对于父View(绿色矩形)的左上角坐标位置,图中getX()=100,getY()=100。
getTranslationX/Y获取的是当前View相对于其当前位置的偏移,向左为负值,向右为正值,因此对于实线黄色矩形来说getTranslationX()=0,getTranslationY()=0,而对于虚线黄色矩形来说getTranslationX()=100,getTranslationY()=100,translationX = getX()-getLeft(),修改translationX/Y的值,会导致getX/Y的变化。但是,如果修改X/Y的值并不会导致translationX/Y的变化,他们的值依然是0。
getLeft/Right/Top/Bottom,获取的是View相对于父View左侧/顶部的距离,图中实线黄色矩形的getLeft()=100,getRight()=200(红色线标识所示),getTop()=100,getBottom()=200(紫色线标识所示),该系列方法严格来讲控制的是View的尺寸而不是位置,因此在setX或者setTranslationX时虽然改变了View的位置,但是其Left/Right/Top/Bottom参数却没有改变。因此对于图中的虚线黄色矩形,getLeft/Right/Top/Bottom获取到的值依然是100/200/100/200,如果通过setLeft(0),setTop(0)方法将实线黄色矩形的left和top值修改为0,则该矩形的左上角会与父View(绿色矩形)的左上角重合,而该矩形的右下角不变,同时getLeft()=0,getTop()=0,getRight()=200,getTop()=200,getX()=0,getY()=0,getTranslationX()=0,getTranslationY()=0。
View的构造函数:共有4个
系统自带的View可以在xml中配置属性,对于写的好的自定义View同样可以在xml中配置属性,为了使自定义的View的属性可以在xml中配置,需要以下4个步骤:
一定要记住:无论是measure过程、layout过程还是draw过程,永远都是从View树的根节点开始测量或计算(即从树的顶端开始),一层一层、一个分支一个分支地进行(即树形递归),最终计算整个View树中各个View,最终确定整个View树的相关属性。
Android的坐标系定义为:
View的位置由4个顶点决定的 4个顶点的位置描述分别由4个值决定:
View的位置是通过view.getxxx()函数进行获取:(以Top为例)
与MotionEvent中 get()和getRaw()的区别
MarginLayoutParams是和外间距有关的。事实也确实如此,和LayoutParams相比,MarginLayoutParams只是增加了对上下左右外间距的支持。实际上大部分LayoutParams的实现类都是继承自MarginLayoutParams,因为基本所有的父容器都是支持子View设置外间距的。
1. 创建自定义属性
2. 继承MarginLayout
3. 重写ViewGroup中几个与LayoutParams相关的方法
在为View设置LayoutParams的时候需要根据它的父容器选择对应的LayoutParams,否则结果可能与预期不一致,这里简单罗列一些常见的LayoutParams子类:
测量规格,封装了父容器对 view 的布局上的限制,内部提供了宽高的信息( SpecMode 、 SpecSize ),SpecSize是指在某种SpecMode下的参考尺寸,其中SpecMode 有如下三种:
针对上表,这里再做一下具体的说明
一般getIntrinsicWidth/Height能获得内部宽/高 图片Drawable其内部宽高就是图
片的宽高 颜色Drawable没有内部宽高的概念 内部宽高不等同于它的大小,一般
Drawable没有大小概念(作为View背景时,会被拉伸至View的大小)
getLocationOnScreen ,计算该视图在全局坐标系中的x,y值,这个值是要从屏幕顶端算起,也就是索包括了通知栏的高度。getLocationInWindow ,计算该视图在它所在的widnow的坐标x,y值, 非常准确!
getLeft , getTop, getBottom, getRight, 这一组是获取相对在它父亲里的坐标。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)