Android View坐标 基本参数 移动

参考文章:

View坐标分析汇总

View坐标系

Android开发艺术探索

android View移动的四种方式

移动View的位置的几种方法

View的移动方式

View的getLeft()、getTranslationX()和getX()的区别

Android进阶笔记-6. 从源码看View体系(坐标,滑动,分发,绘制)

<<Android 开发艺术探索>> Chapter 3

android 自定义View从基础到移动

图片引用来自 第一篇文字
在这里插入图片描述
在这里插入图片描述
移动前
移动后
在这里插入图片描述
上面的"蓝点"表示的一次点击事件。
涉及到的方法一共有下面几个:
view获取自身坐标:getLeft(),getTop(),getRight(),getBottom()
view获取自身宽高:getHeight(),getWidth()
motionEvent获取坐标:getX(),getY(),getRawX(),getRawY()
上面几个参数表达的含义很清晰, 比较让人疑惑的是书中提到的,View的x,y, translationX, translationY这4个参数的含义。
含义如下:
translationX,translationY: View显示相对于初始位置的偏移量.
x,y: View最终可见时的坐标,是View的left,top位置加上translationX,translationY.
left, top: 是View初始在ViewGroup布局时的左上角坐标。

这几个参数是理解View动画的基础。
在View Animation中,对View应用Animation并没有改变View的left, top, right, bottom的属性值,动画的实现是通过其Parent View实现的,在View被drawn时Parents View改变它的绘制参数,draw后再改变参数invalidate,这样虽然View的大小或旋转角度等改变了或进行了平移,但View的实际属性没变,所以有效区域还是应用动画之前的区域,比如你把一按钮放大两倍,但还是放大之前的区域可以触发点击事件。(注意:使用属性动画可以解决实施动画前后点击事件响应区域不一致的问题。)
作者:ahking17
链接:https://www.jianshu.com/p/363d02a7310e
来源:简书

思考

1.坐标相关的有哪些参数,分别是什么含义

2.参数是怎么来的,怎么赋值

3.哪些方法在用这些参数

灵魂拷问0:

有哪些参数?

参数之间的关系(改变了一组参数,其他的参数也会改变吗)

draw()是拿什么来参考位置?

a. left right top bottom :view的四边 相对于父布局 能移动
b. height width :高 宽 来源:
其中分:getHeight()和 getMeasureHeight() 看文章末尾区别
c. traslationx translationy:view相对于父亲的移动值,初始值为 0,和上面 的图结合理解,改变 l r t b会影响traslationx translationy的值 能移动
d. x,y :view左上角相对于父view的距离! 非图二的getX()获取,那是获取事件的距离值!
初始值为 0 来源:x = left + translationX ; y = top + translationY
e.事件X Y: 这是事件的值,分:当前位置的绝对值 event.getRaxX() (图二)和 相对父view值event.getX()(图2)
f.其他 滑动的scollX ,scollY 和 边界margin 值

结论:(可能不正确 正在学习)

1.r l t b 改变可以更改x,y 但同时不会改变transX,Y(transX,Y默认0)
2.trans X,Y 可以改变X,Y(x = left + translationX ; y = top + translationY)
3.除了rltb改变自己,其他没有能改变rltb的值
4.X,Y是最终draw开始的地方,以这个为标准
5.设置X,Y会影响transX,Y的值。

public void setX(float x) {
        setTranslationX(x - mLeft);
    }

6 结合1.2.5 得出 trans和rltb像两个独立的提线棒,改变两组值会改变X,Y,但是只使用setX/Y()改变XY值会 遵循3. 能且只能改变trans的值

参考: View 的 translationX、 translationY , X、Y 和 Left、Top,Right、Bottom

灵魂拷问1:

A.改变了哪些属性?

B.是否重绘?

C.对其他控件有没有影响

1.属性动画
2.view动画
3.scollBy scollTo
3.直接设置translationx ,x ,left

答:

2.view动画会改变translation x,translation y,

灵魂拷问2:以上的改动之后,view绘制(重绘)过程动用了哪些数据。

2.view动画会改变translation x,translation y

文末 转载截取地址:自定义控件三部曲视图篇(一)——测量与布局

getMeasuredWidth()与getWidth()
趁热打铁,就这个例子,我们讲一个很容易出错的问题:getMeasuredWidth()与getWidth()的区别。他们的值大部分时间都是相同的,但意义确是根本不一样的,我们就来简单分析一下。
区别主要体现在下面几点:

  • 首先getMeasureWidth()方法在measure()过程结束后就可以获取到了,而getWidth()方法要在layout()过程结束后才能获取到。
  • getMeasureWidth()方法中的值是通过setMeasuredDimension()方法来进行设置的,而getWidth()方法中的值则是通过layout(left,top,right,bottom)方法设置的。
    还记得吗,我们前面讲过,setMeasuredDimension()提供的测量结果只是为布局提供建议,最终的取用与否要看layout()函数。大家再看看我们上面重写的MyLinLayout,是不是我们自己使用child.layout(left,top,right,bottom)来定义了各个子控件所应在的位置:
int childHeight = child.getMeasuredHeight();
int childWidth = child.getMeasuredWidth();
 
child.layout(0, top, childWidth, top + childHeight);

从代码中可以看到,我们使用child.layout(0, top, childWidth, top + childHeight);来布局控件的位置,其中getWidth()的取值就是这里的右坐标减去左坐标的宽度;因为我们这里的宽度是直接使用的child.getMeasuredWidth()的值,当然会导致getMeasuredWidth()与getWidth()的值是一样的。如果我们在调用layout()的时候传进去的宽度值不与getMeasuredWidth()相同,那必然getMeasuredWidth()与getWidth()的值就不再一样了。
一定要注意的一点是:getMeasureWidth()方法在measure()过程结束后就可以获取到了,而getWidth()方法要在layout()过程结束后才能获取到。再重申一遍!!!!!
————————————————
版权声明:本文为CSDN博主「启舰」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/harvic880925/article/details/47029169

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值