android坐标

来源:互联网 发布:软件压力测试方法 编辑:程序博客网 时间:2024/06/10 08:54

android中的坐标系

在Android系统中,屏幕的左上角是坐标系统的原点(0,0)坐标。原点向右延伸是X轴正方向,原点向下延伸是Y轴正方向。

这里写图片描述

获取绝对坐标的方法

getLocationOnScreen ,计算该视图在全局坐标系中的x,y值,(注意这个值是要从屏幕顶端算起,也就是索包括了通知栏的高度)//获取在当前屏幕内的绝对坐标
getLocationInWindow ,计算该视图在它所在的widnow的坐标x,y值,//获取在整个窗口内的绝对坐标
getLocationInWindow ,计算该视图在它所在的widnow的坐标x,y值,//获取在整个窗口内的绝对坐标
view.getLocationOnScreen(location); 该方法可以获取到当前view与屏幕的关系,location(0)代表X值,表示该view的左边缘与屏幕的左边缘之间的距离。可以想象,当滑屏产生,view开始移动该值肯定会改变的。location(1)代表Y值,表示该view的上边缘与屏幕的上边缘之间的距离,该距离肯定是包含标题栏的高度的。
ps:View.getLocationInWindow()和 View.getLocationOnScreen()在window占据全部screen时,返回值相同,不同的典型情况是在Dialog中时。当Dialog出现在屏幕中间时,View.getLocationOnScreen()取得的值要比View.getLocationInWindow()取得的值要大。

View中提供的获取坐标的方法

getTop\getLeft\getRight\getBottom
getTop:获取到的是View自身的顶边到其父布局顶边的距离
getLeft:获取到的是View自身的左边到其父布局左边的距离
getRight:获取到的是View自身的右边到其父布局左边的距离
getBottom:获取到的是View自身的底部到其父布局顶边的距离
这里写图片描述
针对其父视图的相对位置
这四个方法所获取到的各个左上右下的值与layout的四个参数代表的是一样的,都是相对父视图的左边缘与上边缘。
android.view.View.layout(int l, int t, int r, int b) layout的过程就是确定View在屏幕上显示的具体位置,在代码中就是设置其成员变量mLeft,mTop,mRight,mBottom的值,这几个值构成的矩形区域就是该View显示的位置,不过这里的具体位置都是相对与父视图的位置。mLeft代表当前view(layout的这个view)的左边缘离它的父视图左边缘的距离,以此类推,mTop指当前view的上边缘离父视图上边缘的距离。而以此为界,mRight所指的是当前view的右边缘离父视图左边缘的距离( mLeft+自己的宽度),mBottom也是指当前view的下边缘离父视图的上边缘的距离。

MotionEvent提供的与坐标有关的方法

event.getX,getY

当你触到按钮时,x,y是相对于该按钮左上点(控件本身)的相对位置。
而rawx,rawy始终是相对于屏幕的位置。
event.getX():触摸点相对于其所在组件原点的x坐标

event.getRawX,getRawY

event.getRowX():触摸点相对于屏幕原点的x坐标

View的宽高

view.getWidth,getHeight:

view.getMeasuredHeight,getMeasureWidth:

这里写图片描述

获取控件高度为0的问题

android中取控件的高度有3个方法,但是对于有不可见部分的控件(如listview和scrollview等),要想计算他们的高度必须使用measure方法(并且会出问题)。
支持滚动的空间的measure方式与一般不相同,所以取到的高度也不一定对。
有多种方案可以解决这个问题。这里不再讲解。

与scroller相关

view.getScrollX,getScrollY:

关于Scroll: 屏幕显示的内容很多时,会有超出一屏的情况,于是就产生了Scroll的概念。

getScrollY()
英文原文描述是:
Return the scrolled top position of this view. This is the top edge of the displayed part of your view….
其实理解起来仍然就是:就是这个view相对于“坐标系统原点”(见上图)在Y轴上的偏移量.(getScrollX同理)
getScrollY()就是当前视图相对于屏幕原点在Y轴上的偏移量.
于是乎: view.getScrollY() + event.getY() 就得到了view中的触摸点在Y轴上的偏移量
将整个父视图的左上角定为(0,0),那么子view.getScrollX会获取到屏幕左边缘减去父视图的左边缘为0的距离,特别当滑屏时,父视图会被迫隐藏一部分,因为屏幕的大小是固定的。getScrollY以此类推。

getScrollY等等根本就不是滚动的距离呀

看图示:

这里写图片描述

一个空间从左侧的位置移动到右侧的位置,这个时候的getScrollY() = 0 – 100 = —100
都是拿坐标轴-View的左上角

Scroller.startScroll(int startX, int startY, int dx, int dy)

四个参数分别表示起点的坐标和滑动的向量,即从(startX,startY)开始滑动,横向滑动dx的距离,纵向滑动dy的距离(正值向左滑,负值向右滑),而这里的startX,startY又是参照的父视图左上角为原点坐标的坐标系,滑屏时经常使用getScrollX()和getScrollY()来代表屏幕左边缘和上边缘处于父视图坐标系的具体位置
Scroller.getCurrY,getCurrX(),就是这样用的,这块的写法是固定的

scrollto与scrollby

视图的移动和滚动是不一样的,要区分
scrollTo(x,y):该方法是让View相对于最初始位置滚动某段距离。
例如:我要移动view到坐标点(100,100),那么我的偏移量就是(0,,0) - (100,100) = (-100 ,-100) ,我就要执行view.scrollTo(-100,-100),达到这个效果。

scrollBy(x,y) :该方法是让View相对于当前的位置滚动某段距离。
从源码中看出,它实际上是调用了scrollTo(mScrollX + x, mScrollY + y);
mScrollX + x和mScrollY + y,即表示在原先偏移的基础上在发生偏移,通俗的说就是相对我们当前位置偏移。根据父类VIEW里面移动,如果移动到了超出的地方,就不会显示。

区别:相同之处是他们都是相对于父容器的内部滑动,不同之处是如果2个方法只调用一次,那么都会滑动相同的位置,但是多次调用这2个方法区别就出来了。
scrollTo()是相对于最初始位置滑动某段距离,当第二次调用时,view的位置是不会变化的,也就是说只会滑动一次。
scrollBy()是相对于当前位置滑动某段距离,那么多次调用后,当前位置是不断会更新的,所以scrollBy()方法会让VIew持续滑动起来。

在一个View中,系统提供了scrollTo、scrollBy两种方式来改变一个View的位置。这两个方法的区别非常好理解,与英文中to与by的区别类似,scrollTo(x, y)表示移动到一个具体的坐标(x, y),而scrollBy(dx, dy)表示移动的增量为dx,dy。
Scrollto与scrollby移动的是View的content,即让View的内容移动,如果在ViewGroup中使用scrollTo\scrollBy方法,那么移动的将是所有子View,但如果在View中使用,那么移动的将是View的内容,例如TextView,content就是它的文本,ImageView,content就是它的drawable对象。

所以如果我们想移动View,就该调用它父布局的scrollBy方法,移动它的子View代码如下:
(View)(getParent()).scrollBy(offsetX, offsetY)
view.scrollTo(x,y) 将整个父视图的左上角定为(0,0),再移动这个屏幕的左上角到父视图的点(x,y)处,注意此处的x和y是根据父视图的坐标系来定的。
view.scrollBy(x,y) x代表横向移动的距离,y代表纵向移动的距离
记住:如果scrollBy中的参数dx和dy设置为正数,那么content将向坐标负方向移动,如果将scrollBy中的参数dx和dy设置为负数,那么content将向坐标轴正方向移动。

注意:调用View的scrollTo()和scrollBy()是用于滑动View中的内容,而不是把某个View的位置进行改变。如果想改变莫个View在屏幕中的位置,可以使用如下的方法。
scrollTo(int x, int y) 是将View中内容滑动到相应的位置,参考的坐标系原点为parent View的左上角。

http://blog.csdn.net/vipzjyno1/article/details/24577023

VelocityTracker.getXVelocity()

指滑动速度包括速率和方向两个方面,往左滑动小于0,值为负;往右滑动大于0,值为正。

与动画相关

view.getTranslationX,getTranslationY:

view.getTranslationX计算的是该view的偏移量。初始值为0,向左偏移值为负,向右偏移值为正。具体是相对与什么呢?

动画的参数:

TranslateAnimation详解
Android JDK为我们提供了4种动画效果,分别是: AlphaAnimation,RotateAnimation, ScaleAnimation, TranslateAnimation.今天我想讲解的是TranslateAnimation这个动画效果。也是本人在做一个移动图片的动画效果的项目时,遇到了一些问题。在网上查了很多资料,搞了好几天。终于明白怎么使用这个TranslateAnimation,在本文中记录下来,以便以后忘记了可以查阅。
TranslateAnimation是移动的动画效果。它有三个构造函数,分别是:
1.publicTranslateAnimation(Context context,AttributeSet attrs) 略过
2.publicTranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
这个是我们最常用的一个构造方法,
float fromXDelta:这个参数表示动画开始的点离当前View X坐标上的差值;
float toXDelta, 这个参数表示动画结束的点离当前View X坐标上的差值;
float fromYDelta, 这个参数表示动画开始的点离当前View Y坐标上的差值;
float toYDelta)这个参数表示动画开始的点离当前View Y坐标上的差值;
如果view在A(x,y)点 那么动画就是从B点(x+fromXDelta, y+fromYDelta)点移动到C 点(x+toXDelta,y+toYDelta)点.
3.public TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)
fromXType:第一个参数是x轴方向的值的参照(Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF,or Animation.RELATIVE_TO_PARENT);
fromXValue:第二个参数是第一个参数类型的起始值;
toXType,toXValue:第三个参数与第四个参数是x轴方向的终点参照与对应值;
后面四个参数就不用解释了。如果全部选择Animation.ABSOLUTE,其实就是第二个构造函数。
以x轴为例介绍参照与对应值的关系:
如果选择参照为Animation.ABSOLUTE,那么对应的值应该是具体的坐标值,比如100到300,指绝对的屏幕像素单位
如果选择参照为Animation.RELATIVE_TO_SELF或者 Animation.RELATIVE_TO_PARENT指的是相对于自身或父控件,对应值应该理解为相对于自身或者父控件的几倍或百分之多少。多试参数就明白了。
其他涉及视图动画和属性动画的地方可以具体参看之前写的博客。

说明:

计算偏移量的时候,一定要保证是在同一坐标下。
关键是要搞清楚是相对于哪个坐标体系的。
http://blog.csdn.net/mr_immortalz/article/details/51168278
以上总结得很好。

0 0
原创粉丝点击