安卓坐标

  1 说来说去都不如 画图示意 简单易懂啊!!!真是的! 来吧~~先上张图~~!
  2
  3
  4 (一)首先明确一下 Android 中的坐标系统 :
  5      屏幕的左上角是坐标系统原点(0,0)
  6      原点向右延伸是X轴正方向,原点向下延伸是Y轴正方向
  7
  8 (二)关于Scroll: 屏幕显示的内容很多时,会有超出一屏的情况,于是就产生了Scroll的概念。
  9
 10       在View类中有个方法:
 11       getScrollY()  英文原文描述是:
 12       Return the scrolled top position of this view. This is the top edge of the displayed part of your view....
 13       其实理解起来仍然就是:就是这个view相对于“坐标系统原点”(见上图)在Y轴上的偏移量.(getScrollX同理)
 14      【哇哈,有了图就是好说明啊~ 省了多少语言描述啊,而且还不一定能说清楚~】
 15
 16       getScrollY()就是当前视图相对于屏幕原点在Y轴上的偏移量.
 17
 18 (三)MotionEvent类中 getRowX()和 getX()的区别:
 19
 20       event.getRowX():触摸点相对于屏幕原点的x坐标
 21       event.getX():   触摸点相对于其所在组件原点的x坐标
 22
 23      于是乎: view.getScrollY() + event.getY() 就得到了view中的触摸点在Y轴上的偏移量
 24
 25
 26 (四)TextView类中
 27
 28        有个 getLayout()方法:the Layout that is currently being used to display the text. This
 29
 30                                can be null if the text or width has recently changes.
 31
 32        其返回类型是Layout ,也就是返回textView的布局。
 33
 34
 35
 36        然后重要的是通过这个 layout调用一个方法:
 37
 38        getLineForVertical(int verticalPointPosition)  //得到某点在垂直方向上的行数值
 39
 40
 41
 42        于是综上所述,在实际的触摸事件中可以这样使用:
 43
 44        Layout layout=textView.getLayout();
 45
 46        int line = layout.getLineForVertical(textView.getScrollY() + (int) event.getY());
 47
 48        //得到触摸点在textView中垂直方向上的行数值。参数是触摸点在Y轴上的偏移量
 49
 50
 51
 52       接下来继续介绍一个方法,要用到上边的 layout 和 line:
 53
 54       layout.getOffsetForHorizontal( line ,  (int) event.getX() );
 55
 56       //得到触摸点在某一行水平方向上的偏移量。
 57
 58         参数分别是: 该行行数值 和 触摸点在该行X轴上的偏移量。
 59
 60         此方法得到的该值会根据该行上的文字的多少而变化,并不是横向上的像素大小;
 61
 62
 63
 64
 65
 66 整个坐标系是以手机屏幕左上角为原点(0,0),如果在屏幕没有滑动之前,这一理解肯定是ok的,但在滑屏之后,就会产生很多歧义和混淆,原因在于使用过程当中,很多方法的参数并非是参照屏幕,而是相对于父视图,对这整个过程和后面自定义控件的坐标变化带来的各个参数变化来说理解起来就并不那么适合了,最开始给人的感觉是越来越不清楚这个坐标该怎么设置,好像坐标系总在发生变化,后来才慢慢在思维当中构建起视图与视图容器以及屏幕之间的关系。
 67
 68 android.view.View.layout(int l, int t, int r, int b)    layout的过程就是确定View在屏幕上显示的具体位置,在代码中就是设置其成员变量mLeft,mTop,mRight,mBottom的值,这几个值构成的矩形区域就是该View显示的位置,不过这里的具体位置都是相对与父视图的位置。mLeft代表当前view.layout的这个view的左边缘离它的父视图左边缘的距离,拿上面“子视图2.layout(int l, int t, int r, int b) ”来说,它的父视图便是子视图1,2,3合起来形成的整个大矩形,那么这里将父视图的左上角定为(0,0),那么可以确定mLeft为一个子视图宽度320,以此类推,mTop指当前view的上边缘离父视图上边缘的距离。而以此为界,mRight所指的是当前view的右边缘离父视图左边缘的距离,一眼可以看出值为640(mLeft+自己的宽度),mBottom也是指当前view的下边缘离父视图的上边缘的距离。至于为何如此,大概是因为坐标系的缘故,坐标中的任何点都必须以(0,0)为起点,XY轴为衡量。
 69
 70 视图左侧位置  view.getLeft()
 71 视图右侧位置 view.getRight()
 72
 73 视图顶部位置 view.getTop();
 74 视图底部位置 view.getBottom();
 75 这四个方法所获取到的各个左上右下的值与layout的四个参数代表的是一样的,都是相对父视图的左边缘与上边缘。
 76
 77 视图宽度 view.getWidth();
 78 视图高度 view.getHeight() ;
 79 这两个方法获取的是该view的高和宽,仅仅在滑动的情况下,或者说该view的大小如果不发生变化,它的值是不会变的。
 80 getMeasuredWidth();
 81 getMeasuredHeight();
 82 说到这里就不得不提getWidth()、getHeight()和getMeasuredWidth()、getMeasuredHeight()这两对函数之间的区别,getMeasuredWidth()、getMeasuredHeight()返回的是measure过程得到的mMeasuredWidth和mMeasuredHeight的值,而getWidth()和getHeight()返回的是mRight - mLeft和mBottom - mTop的值。一般情况下layout过程会参考measure过程中计算得到的mMeasuredWidth和mMeasuredHeight来安排子视图在父视图中显示的位置,但这不是必须的,measure过程得到的结果可能完全没有实际用处,特别是对于一些自定义的ViewGroup,其子视图的个数、位置和大小都是固定的,这时候我们可以忽略整个measure过程,只在layout函数中传入的4个参数来安排每个子视图的具体位置。
 83
 84 view.getX();
 85 view.getY();
 86 getX和getY获取到的值为相对于父视图而言的两个左边缘和上边缘的距离。
 87
 88 view.getLocationOnScreen(location);  该方法可以获取到当前view与屏幕的关系,location(0)代表X值,表示该view的左边缘与屏幕的左边缘之间的距离。可以想象,当滑屏产生,view开始移动该值肯定会改变的。location(1)代表Y值,表示该view的上边缘与屏幕的上边缘之间的距离,该距离肯定是包含标题栏的高度的。
 89 getLocationInWindow();
 90
 91 ps:View.getLocationInWindow()和 View.getLocationOnScreen()在window占据全部screen时,返回值相同,不同的典型情况是在Dialog中时。当Dialog出现在屏幕中间时,View.getLocationOnScreen()取得的值要比View.getLocationInWindow()取得的值要大。
 92
 93 VelocityTracker.getXVelocity() 指滑动速度包括速率和方向两个方面,往左滑动小于0,值为负;往右滑动大于0,值为正。
 94
 95
 96
 97
 98 view.scrollTo(x,y)  将整个父视图的左上角定为(0,0),再移动这个屏幕的左上角到父视图的点(x,y)处,注意此处的x和y是根据父视图的坐标系来定的。
 99 view.scrollBy(x,y)  x代表横向移动的距离,y代表纵向移动的距离
100
101 view.getScrollX
102 view.getScrollY
103 将整个父视图的左上角定为(0,0),那么子view.getScrollX会获取到屏幕左边缘减去父视图的左边缘为0的距离,特别当滑屏时,父视图会被迫隐藏一部分,因为屏幕的大小是固定的。getScrollY以此类推。
104
105 event.getX()
106 event.getY()
107 相对父视图左上角(0,0)触摸点的坐标值。
108
109 Scroller.getCurrY()
110 Scroller.getCurrX()
111 该方法拿横轴来说,代表屏幕的左边缘离父视图的左边缘的距离。
112
113 Scroller.startScroll(int startX, int startY, int dx, int dy)
114 四个参数分别表示起点的坐标和滑动的向量,即从(startX,startY)开始滑动,横向滑动dx的距离,纵向滑动dy的距离(正值向左滑,负值向右滑),而这里的startX,startY又是参照的父视图左上角为原点坐标的坐标系,滑屏时经常使用getScrollX()和getScrollY()来代表屏幕左边缘和上边缘处于父视图坐标系的具体位置
115
116 TranslateAnimation()
117 参数参照:http://blog.sina.com.cn/s/blog_90b91bf10101ai3e.html
118
119
120 以上是在做滑屏控件经常用到的方法,一方面需要了解layout和measure的基本流程,更重要一方面,当你想要实现某一个效果的时候,比如slidingmenu那样的控件,查看源码我们可以知道它是继承的ViewGroup,该怎样入手去做呢。
121
122 首先,需要了解它的父视图是什么,slidingmenu为例,打开程序,第一眼,是一个很普通的视图页面,当向右滑动手指,这个视图页面开始向右边移动,而从左边会慢慢移出来另一部分视图,看上去像是抽出来的或者是隐藏的,事实上抛开阴影效果来讲,想象手机屏幕的左边有一部分我们看不到的视图,它就是这个被抽出来的menu视图了。概括来说,一个主view,一个menu其实是并排于一个大视图上面的。
123 找到了父视图,接下来就好办了,认定这个父视图的宽度就是主view的宽度和menu的宽度之和(暂不考虑padding之类),高度就是屏幕的高度,那么在思维当中这个二维平面就产生了,将它想成一张纸,然后对准主view将这张纸贴到手机屏幕上,左右滑动,会看到其实slidingmenu也就是这么个效果。
124
125 然后,实现的思路会清晰很多。定义这个父视图为myview继承viewgroup,原因在于尽管主view和menu并排在一个大view下,但毕竟两者的内容不同,后面需要放进不同的控件处理不同的事件,这个父视图内包含着两个view,到时候处理起来会方便很多,setcontentview为这个父视图,那么打开程序的第一眼就会看到它。再定义这两个view设置好两个内容布局,并将它们addview添加到myview当中。外部工作基本就完成了,可以呈现父视图,并且父视图内有两个子view。
126
127 接下来,需要去完善一些细节,父视图内的子view该如何放置,这是关乎成败的一环,也就是如何将这张纸贴到我们希望的位置,这时就是onlayout的处理了,处理好屏幕,父视图子view之间的位置关系,通过各自的layout参数设置来摆放妥当各个view,比如开始的时候menu是隐藏的,这个就是通过位置的摆放设置的,然后它是从左边滑出来的,说明它处于父视图的左边位置,而主view处于相对右边的位置,而屏幕刚好也处于父视图右边的位置,恰好能看到主view的全貌,在脑海里如果能有清晰的画面出现,实现起来就会轻松很多。当实现了这个摆放,就可以理解menudrawer里面上下左右都可以滑出menu的结构了。
128
129 最后,便是滑动效果,请相信这样的控件里面,任何处理肯定都会和view位置的摆放扯上关系,滑动方向,滑动距离等等都涉及到坐标的处理。这也是为何上面列出那些常用的获取view坐标的方法。
130
131 总结下来,构建类似这样的控件,也就这三点,明确父子视图和屏幕的关系,通过坐标和位置参数设置它们的关系,处理这些关系发生变化的情况。
132
133
134 当然,事实上slidingmenu远远没这么简单,其中为了方便后续开发,它内置了很多接口和处理,大多数都是位置坐标和事件监听相关联,而万变不离其宗的是,它也肯定有这三个方面的构建,理解了这些基本的东西,尝试做一些自己想象的效果,对自定义的理解来说,进步会非常大。
135
136
137
138
139 资料来自互联网
140
141
142 Android~获取view在屏幕中的位置
143
144 getLocalVisibleRect , 返回一个填充的Rect对象, 感觉是这个View的Rect大小,left,top取到的都是0
145
146 getGlobalVisibleRect , 获取全局坐标系的一个视图区域, 返回一个填充的Rect对象;该Rect是基于总整个屏幕的
147
148 getLocationOnScreen ,计算该视图在全局坐标系中的x,y值,(注意这个值是要从屏幕顶端算起,也就是索包括了通知栏的高度)//获取在当前屏幕内的绝对坐标
149
150 getLocationInWindow ,计算该视图在它所在的widnow的坐标x,y值,//获取在整个窗口内的绝对坐标 (不是很理解= =、)
151
152 getLeft , getTop, getBottom, getRight,  这一组是获取相对在它父亲里的坐标
153
154 **注**:如果在Activity的OnCreate()事件输出那些参数,是全为0,要等UI控件都加载完了才能获取到这些
155
156 example:
157
158     int[] location = new int[2];
159     v.getLocationOnScreen(location);
160     int x = location[0];
161     int y = location[1];
时间: 2024-11-02 20:03:16

安卓坐标的相关文章

Cocos2D-Android-1之源码详解:22.TileMapTest

package org.cocos2d.tests; import java.util.HashMap; import javax.microedition.khronos.opengles.GL10; import org.cocos2d.actions.base.CCRepeatForever; import org.cocos2d.actions.instant.CCCallFuncN; import org.cocos2d.actions.interval.CCFadeIn; impor

进阶篇-安卓系统:4.安卓手机动作传感器

动作传感器对于监测设备的移动非常有用,例如:倾斜.震动.旋转和摆动都属于动作传感器的监测范围.设备的移动通常是对用户输入的直接反应. 所有动作传感器都会返回三个浮点数的值,对于不同的传感器,这三个值的意义不同.例如,对于加速度传感器,会返回三个坐标轴的加速数据.对于陀螺仪传感器,会返回三个坐标周的旋转角速度. 动作传感器的使用与数据返回:加速度传感器 如果单纯的使用加速度传感器传回的数据,会发现Z轴的的加速度是9.8多.所以看来安卓是把静止的手机竖直加速度默认为重力加速度,并且XY轴的数据也不是

软件体系结构---安卓系统架构之应用程序框架层分析---1

本博客只介绍安卓系统架构中的应用程序框架层 什么是应用程序框架? 应用程序框架可以说是一个应用程序的核心,是所有参与开发的程序员共同使用和遵守的约定,大家在其约定上进行必要的扩展,但程序始终保持主体结构的一致性.其作用是让程序保持清晰和一目了然,在满足不同需求的同时又不互相影响. 而对于安卓来说:Android系统提供给应用开发者的本身就是一个框架,所有的应用开发都必须遵守这个框架的原则.我们在开发应用时就是在这个框架上进行扩展.在这个框架中我们可以完全访问核心应用程序所使用的API框架,即我们

第四周安卓作业

任务一 1.图片选择器之跑马灯 <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_f

JAVA安卓植物大战僵尸主题四子棋游戏

@前言 这里使用安卓最基本的API实现双人四子棋游戏(无AI),开发语言为java,开发环境为Android Studio 2.1.2,目标SDK版本为24,最低为15: 界面采用植物大战僵尸主题,图片资源来源于网络,进行了PS加工,非原创: 游戏界面基本可以适配所有安卓手机分辨率,不过在分辨率太大或太小的手机上整体效果会有影响: Github源码: https://github.com/jiangxh1992/FourInRowGame 视频演示: https://vimeo.com/1875

开源中国安卓客户端源码之自定义控件---ScreenShotView

首先,感谢开源中国的开源精神.当初学者拿到客户端源码时,可能会对其中的项目结构和代码产生许多困惑,不知道该从何下手,当然我也是其中一员,接触安卓时间不长,也不是很精通,但是通过一段时间的琢磨,慢慢地领会到其中的一些编程方法,我只是想把我弄明白的这些知识通过博客的形式记录下来,以备以后查看,当然也可以帮助到更多的初学者.我的主要工作是给代码添加注释,理顺调用关系,让初学者更快.更深刻地理解代码的含义,领会其精神.首先大家从http://git.oschina.net/oschina/android

2.1安卓视图组件

1视图组件与容器组件 1)绝大部分安卓UI组件都存放与android.widget包及其子包,android.view及其子包 2)安卓所有 UI组件都继承自View类 3)View类有一个非常重要的子类:ViewGroup,但是ViewGroup经常作为其他组件的容器使用,安卓采用组合器模式设计View和ViewGroup VIewGroup可以当作View使用,但一般都是作为容器使用;但是ViewGroup是抽象类 实际都是用他的子类,如各种布局管理器 /** * <p> * A <

ios:仿照安卓小米商城head左右滚动效果(多屏滚动)

1.之前做的应用需要这个效果但是当时用的比较复杂(绘图)的方法来实现,现在想到了一个新的方法. 2.用到了http://www.cnblogs.com/yoon/p/3616503.html 里面的小技巧 3.思路: 主要是在新的scrollview中重写Layoutsubviews 代码如下: - (void)layoutSubviews { [super layoutSubviews]; for (UIView *view in self.subviews) { if (view.tag =

安卓,采用最简单易懂的方式实现上拉刷新下拉加载更多

<!-- Description:上拉刷新,下拉加载更多是现在最流行的手势操作,但是对于初学者来说,在实现上是有一定难度的, 网上很多教程讲的都过于复杂,对于初学者无法起到引导作用,特此写本文,帮助安卓新手入门理解此, 还有最为重要的一点:本文只帮助你理解,并不是想你成为代码搬运工!别被那么多代码吓到了, 其中很多都是注释,仔细看注释对你理解有很大的帮助 Author:Booker L Date:2014-05-16 --> 一,事先准备: 实现该功能,最基本的需要两个东西,一个是OnTouc