Android坐标系详解

View中的scrollTo方法配合Scroller类,可以实现视图的位移动画效果。相对于补间动画,这种实现方式更加灵活,而且不仅改变了视图的绘制位置,也改变了视图的点击区域,可以认为是一种“真实”的位置改变。对于初学者来说,scrollTo的滚动方向问题往往是让人迷惑的,今天来说一说我对这个问题的理解。

首先来分析“滚动”这一概念,“滚动”需要两个元素:滚动对象A和滚动参照物,进一步说,是滚动对象A和参照物上的坐标系B,A的位置改变由B坐标系中的X,Y值唯一决定。所以,先来看一看android中的坐标系:

1)屏幕绝对坐标系,以手机屏幕左上角为坐标原点,x轴向右,y轴向下,如下图所示:

当我们调用relativeLayout.getLocationOnScreen(intlocation[])方法时,获得的位置就是relativeLayout左上角在屏幕绝对坐标中的位置。再比如,当有一个触屏动作MotionEvent发生时,调用getRawX(),getRawY()方法获取到的就是触屏中心点在屏幕绝对坐标中的位置。

2)视图相对坐标系,描述的是子视图在父视图中的位置,以父视图的左上角为坐标原点,x轴向右,y轴向下,如下图所示:

    

在上图中,相对布局上放了一个按钮,那么当button调用getX()和getY()方法时,获得的是button左上角在父视图坐标中的坐标值。

3)由以上两点,可以发现,在android中,坐标系往往以某一参照物的左上角为坐标原点,x轴方向向右,y轴方向向下。按照常理,在不同的坐标系中,坐标轴的方向应该具有一致性,否则会不必要地增加复杂度。

现在再来具体分析scrollTo方法。对于这个方法,重点是弄清楚两点:谁在滚动,以及在哪个坐标系中滚动。

对于两个问题,我的理解是:1,当View调用scrollTo方法时,是View在滚动,更具体的说,是View的可视区域在滚动;2,View的可视区域相对于View的内容(content)坐标系滚动。

先来看图:

 上图是一个相对布局,上面放了5个按钮,其中蓝色区域是相对布局的区域,注意到按钮大部分都在布局以外。我们常说的视图指的其实是View的可视区域,也就是蓝色的部分,它是有边界的;但视图的内容其实是无边界的,如图中的按钮,可以放在距离蓝色区域任意远的地方,它只是不显示在手机屏幕上,不代表它不存在。

视图的内容坐标系:以可视区域初始的左上角位置为坐标原点,x轴向右为正,y轴向下为正。View的mScrollX和mScrollY属性表示可视区域左上角在这个坐标系中的位置,于是初始状态下两个值都为0。

现在调用relativeLayout.scrollTo(-100,30)方法,它会使mScrollX=-100,mScrollY=30,也就是说相对布局的可视区域移动到以下位置:

  注意,相对布局的可视区域是在本身的内容坐标系中移动,在屏幕绝对坐标系中并没有移动,所以在屏幕上看到的效果是按钮向右上方移动。

时间: 2024-12-04 02:18:05

Android坐标系详解的相关文章

使用OpenGL开发Android应用详解系列三

注:近三篇转载中的视锥体部分结合着来看,再参照老罗的3d变换,基本可以初步理解和完成相关视锥体调整. 使用OpenGL开发Android应用详解系列三 [原创]转载请注明出处 我一家网 http://www.5yijia.com 前面两节主要介绍了一下OpenGL的基本概念,以及在Android开发中引入OpenGL时,Android项目的基本构成情况.这一节开始,我们通过具体的实例,来进行简单3D图形的描画. 注:代码基础还是采用上一节: 使用OpenGL开发Android应用详解系列二中使用

Android Menu详解及示例代码_Android

Android Menu 详细介绍: 1.选项菜单 OptionsMenu 2.上下文菜单 ContextMenu 3.子菜单 SubMenu 组成Android用户界面的除了View以外,还有菜单和对话框,这一讲我们就共同学习一下菜单的使用. 菜单是用户界面中最常见的元素,使用也非常频繁,在Android中,菜单被分为如下三种,选项菜单(OptionsMenu).上下文菜单(ContextMenu)和子菜单(SubMenu),下面分别举例说明. 一.选项菜单 OptionsMenu Andro

Android签名详解(debug和release)

Android签名详解(debug和release) 1. 为什么要签名 1) 发送者的身份认证 由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,以此保证签名不同的包不被替换 2) 保证信息传输的完整性 签名对于包中的每个文件进行处理,以此确保包中内容不被替换 3) 防止交易中的抵赖发生,Market对软件的要求 2. 签名的说明 1) 所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序 2) Android程序包使用的数字证书可以

Android CardView详解及使用方法和实例_Android

Android  CardView详解 Android5.0中向我们介绍了一个全新的控件–CardView,从本质上看,可以将CardView看做是FrameLayout在自身之上添加了圆角和阴影效果.请注意:CardView被包装为一种布局,并且经常在ListView和RecyclerView的Item布局中,作为一种容器使用. 发现个好看的东东 CardView,他在support v7包中~~ 顾名思义就是卡片view,可以设置阴影,圆角,等等.. 样子是这样的: 或者你还可以放到list

如何正确使用Android线程详解_Android

前言 对于移动开发者来说,"将耗时的任务放到子线程去执行,以保证UI线程的流畅性"是线程编程的第一金科玉律,但这条铁则往往也是UI线程不怎么流畅的主因.我们在督促自己更多的使用线程的同时,还需要时刻提醒自己怎么避免线程失控. 多线程编程之所以复杂原因之一在于其并行的特性,人脑的工作方式更符合单线程串行的特点.一个接着一个的处理任务是大脑最舒服的状态,频繁的在任务之间切换会产生"头痛"这类系统异常.人脑的多任务和计算机的多任务性能差异太大导致我们在设计并行的业务逻辑之

Android CoordinatorLayout详解及实例代码_Android

Android CoordinatorLayout详解 一.CoordinatorLayout有什么作用 CoordinatorLayout作为"super-powered FrameLayout"基本实现两个功能: 1.作为顶层布局 2.调度协调子布局 CoordinatorLayout使用新的思路通过协调调度子布局的形式实现触摸影响布局的形式产生动画效果.CoordinatorLayout通过设置子View的 Behaviors来调度子View.系统(Support V7)提供了A

Android RecyclerView详解之实现 ListView GridView瀑布流效果_Android

 什么是RecyclerView RecyclerView 是Google推出的最新的 替代ListView.GridView的组件,RecyclerView是用来显示大量数据的容器,并通过有限数量的子View,来提高滚动时的性能. 与ListView不同,RecyclerView 不再负责布局,而是专注于布局复用.布局主要通过 LayoutManager来管理,目前提供了3种常用的布局管理: LinearLayoutManager 线性布局管理器 (ListView效果) GridLayout

Android GPS详解及示例代码_Android

LBS(Location Based Services)直译的话就是基于地理位置的服务,这里面至少有两层意思,第一要能轻易的获取当前的地理位置,譬如经纬度海拔等,另一个就是在当前位置的基础上提供增值服务,譬如找附近的加油站.餐馆.酒店等.这里面的第一步:获取用户当前位置,我们就可以用Android的GPS定位服务来得到.Android提供了基于网络的定位服务和基于卫星的定位服务两种.在设置->位置和安全设置里面的前三项就是,最后一个增强型GPS是为了辅助快速找卫星的.  那么我们现在就写一个简单

Android Service详解及示例代码_Android

Android Service 详细介绍: 1.Service的概念 2.Service的生命周期 3.实例:控制音乐播放的Service 一.Service的概念 Service是Android程序中四大基础组件之一,它和Activity一样都是Context的子类,只不过它没有UI界面,是在后台运行的组件. 二.Service的生命周期 Service对象不能自己启动,需要通过某个Activity.Service或者其他Context对象来启动.启动的方法有两种,Context.startS