View是Android中所有控件的基类,不管是简单的Button和TextView,还是复杂的RelativeLayout和ListView,其基类都是View类;ViewGroup也继承了View类,这意味着View本身就可以代表简单的和复杂的所有控件和布局,通过这种关系,就形成了View树的结构。

  在操作View的时候,尤其是在处理自定义View的一些事件的时候,我们往往需要获取到目标View的这样或那样的参数。下面就来简单介绍一下View的各种参数及其用法。

  View有这样的一些属性:x、y、z、left、right、top、bottom、elevation、translationX、translationY、translationZ、rawX、rawY等等,下面一一介绍这些参数的意义及如何获取这些参数。

  这里需要注意一点:以下方法,如果直接在Activity的onCreate()方法中调用,则可能会返回0,这是因为在程序刚刚启动,刚刚开始绘制这个View的时候,我们就要获取这个View的各个位置参数,当然会返回0。解决方法是:在Activity的 onWindowFocusChanged() 方法中获取;或者可以新建一个线程,先 Thread.sleep() 一段时间之后,再获取这些参数。

left、right、top、bottom、elevation

  这五个参数代表的是View的原始位置相对于其父控件边缘的距离:

  • left:目标View的最左边和这个View所在父控件的最左边的距离,通过view.getLeft()方法获取;
  • right:目标View的最右边和这个View所在父控件的最左边的距离,通过view.getRight()方法获取;
  • top:目标View的最上边和这个View所在父控件的最上边的距离,通过view.getTop()方法获取;
  • bottom:目标View的最下边和这个View所在父控件的最上边的距离,通过view.getBottom()方法获取;
  • elevation:目标View的Z轴高度和这个View所在的父控件所在的Z轴高度的距离,通过view.getElevation()方法获取(这个属性是Android 5.0之后添加的新属性)。

  left、right、top和bottom四个属性的关系如下图所示:

  注意:View的这五个属性值代表的是View的原始位置坐标值,无论这个View被移动到了什么位置,或者被缩放、旋转了多少,这五个值都是永久不变的。

translationX、translationY、translationZ

  这三个参数代表的是在动画或者滑动View的时候,View的当前位置相对于其原始位置平移的距离:

  • translationX:在滑动过程中,View当前位置的最左边和这个View原始位置的最左边的距离,通过view.getTranslationX()方法获取;
  • translationY:在滑动过程中,View当前位置的最上边和这个View原始位置的最上边的距离,通过view.getTranslationY()方法获取;
  • translationZ:在动画过程中,View当前位置的Z轴高度和这个View原始Z轴高度的距离,通过view.getTranslationZ()方法获取(这个方法是Android 5.0之后添加的新方法)。

x、y、z

  这三个参数代表的是View的当前位置相对于其父控件的距离:

  • x:目标View的当前位置的最左边和这个View所在父布局的最左边的距离,通过view.getX()方法获取;
  • y:目标View的当前位置的最上边和这个View所在父布局的最上边的距离,通过view.getY()方法获取;
  • z:目标View的当前位置的Z轴位置和这个View所在父布局的Z轴位置的距离,通过view.getZ()方法获取(这个方法是Android 5.0之后添加的新方法)。

  这三个参数和前面的几个参数的关系公式如下:

  • x = left + translationX;
  • y = top + translationY;
  • z = elevation + translationZ;

MotionEvent相关

  MotionEvent是我们用来操作View的触摸事件的类,当我们对屏幕进行一次操作的时候,就会触发MotionEvent中的几个触摸事件:

  • ACTION_DOWN:手指刚刚触摸到屏幕时触发的事件;
  • ACTION_MOVE:手指在屏幕上移动的时候触发的事件;
  • ACTION_UP:手指从屏幕上抬起的一瞬间触发的事件。

  因此,对于我们常常做的一些操作,相应的事件触发顺序如下:

  • 点击屏幕后立刻抬起手指:DOWN -> UP
  • 滑动屏幕:DOWN -> MOVE -> ... -> MOVE -> UP

  使用MotionEvent类,我们还可以获取到触摸屏幕时View的一些位置参数:

  • x:当前触摸的位置相对于目标View的X轴坐标,通过getX()方法获取;
  • y:当前触摸的位置相对于目标View的Y轴坐标,通过getY()方法获取;
  • rawX:当前触摸的位置相对于屏幕最左边的X轴坐标,通过getRawX()方法获取;
  • rawY:当前触摸的位置相对于屏幕最上边的Y轴坐标,通过getRawY()方法获取。

View相对屏幕的距离

  这里说的View相对屏幕的距离,是指View的左上角相对于手机屏幕左上角的坐标。可以使用以下几个方法获取:

getLocationInWindow()

  这个方法的用法代码如下:

int[] position = new int[2];
view.getLocationInWindow(position);
System.out.println("(" + position[0] + "," + position[1] + ")");

  如果当前Activity是普通的Activity,则用这个方法得到的position数组中的第二个参数(Y坐标值)表示可见的状态栏的高度 + 可见的标题栏的高度 + View上端到标题栏下端的距离;

  如果当前Activity是对话框式的Activity,则Y坐标值表示可见的标题栏的高度 + View上端到标题栏下端的距离。

  注意:这里的“可见”表示的是能看到的,如果一个Activity中的状态栏或标题栏被隐藏了,则其高度用0表示。

getLocationOnScreen()

  这个方法的用法代码如下:

int[] position = new int[2];
view.getLocationOnScreen(position);
System.out.println("(" + position[0] + "," + position[1] + ")");

  这个方法对Y坐标的要求和上面的方法相同。

getGlobalVisibleRect()

  这个方法的用法代码如下:

Rect rect = new Rect();
view.getGlobalVisibleRect(rect);
System.out.println("(" + rect.left + "," + rect.top + ")");

  Rect在这里的作用是“套住”这个View,其对Y坐标的要求和上面的方法相同。

【Android - 自定义View】之View的位置参数的更多相关文章

  1. Android自定义View4——统计图View

    1.介绍 周末在逛慕课网的时候,看到了一张学习计划报告图,详细记录了自己一周的学习情况,天天都是0节课啊!正好在学习Android自定义View,于是就想着自己去写了一个,这里先给出一张慕课网的图,和 ...

  2. 【朝花夕拾】Android自定义View篇之(十一)View的滑动,弹性滑动与自定义PagerView

    前言 由于手机屏幕尺寸有限,但是又经常需要在屏幕中显示大量的内容,这就使得必须有部分内容显示,部分内容隐藏.这就需要用一个Android中很重要的概念——滑动.滑动,顾名思义就是view从一个地方移动 ...

  3. Android 自定义View及其在布局文件中的使用示例

    前言: 尽管Android已经为我们提供了一套丰富的控件,如:Button,ImageView,TextView,EditText等众多控件,但是,有时候在项目开发过程中,还是需要开发者自定义一些需要 ...

  4. Android自定义View 画弧形,文字,并增加动画效果

    一个简单的Android自定义View的demo,画弧形,文字,开启一个多线程更新ui界面,在子线程更新ui是不允许的,但是View提供了方法,让我们来了解下吧. 1.封装一个抽象的View类   B ...

  5. (转)[原] Android 自定义View 密码框 例子

    遵从准则 暴露您view中所有影响可见外观的属性或者行为. 通过XML添加和设置样式 通过元素的属性来控制其外观和行为,支持和重要事件交流的事件监听器 详细步骤见:Android 自定义View步骤 ...

  6. Android 自定义View合集

    自定义控件学习 https://github.com/GcsSloop/AndroidNote/tree/master/CustomView 小良自定义控件合集 https://github.com/ ...

  7. Android 自定义View (五)——实践

    前言: 前面已经介绍了<Android 自定义 view(四)-- onMeasure 方法理解>,那么这次我们就来小实践下吧 任务: 公司现有两个任务需要我完成 (1)监测液化天然气液压 ...

  8. Android 自定义 view(四)—— onMeasure 方法理解

    前言: 前面我们已经学过<Android 自定义 view(三)-- onDraw 方法理解>,那么接下我们还需要继续去理解自定义view里面的onMeasure 方法 推荐文章: htt ...

  9. Android 自定义 view(三)—— onDraw 方法理解

    前言: 上一篇已经介绍了用自己定义的属性怎么简单定义一个view<Android 自定义view(二) -- attr 使用>,那么接下来我们继续深究自定义view,下一步将要去简单理解自 ...

  10. Android 自定义view(二) —— attr 使用

    前言: attr 在前一篇文章<Android 自定义view -- attr理解>已经简单的进行了介绍和创建,那么这篇文章就来一步步说说attr的简单使用吧 自定义view简单实现步骤 ...

随机推荐

  1. java和Jvm目录

    回到占占推荐博客索引 主要介绍java基础知识,非框架类及JVM相关的内容文章 java和Jvm目录 Java~关于开发工具和包包 Java~类,抽象类和接口 Java~时间戳小知识 Java~命名规 ...

  2. 配置Docker镜像加速

    1.在docker toolbox执行下面的命令进入VM bash docker-machine ssh default 2.执行下面的命令修改profile文件: sudo vi /var/lib/ ...

  3. Python中使用字典的几个小技巧

    1 解包 所谓解包,就是将字典通过 ** 操作符转为 Key=Value 的形式,这种形式可以直接传给函数作为关键字参数. 说说适用的几种情况. 1.1 搜索拼接条件 当应用中使用类似 SQLAlch ...

  4. 为什么磁盘慢会导致Linux负载飙升?

    一.CPU利用率和负载率的区别 这里要区别CPU负载和CPU利用率,它们是不同的两个概念,但它们的信息可以在同一个top命令中进行显示.CPU利用率显示的是程序在运行期间实时占用的CPU百分比,这是对 ...

  5. python分支和循环结构

    本文收录在Python从入门到精通系列文章系列 1. 分支结构 1.1 应用场景 迄今为止,我们写的Python代码都是一条一条语句顺序执行,这种代码结构通常称之为顺序结构.然而仅有顺序结构并不能解决 ...

  6. 原生JS封装_new函数,实现new关键字的功能

    1.前言 众所周知:没有对象怎么办?那就new一个! 那么在JS中,当我们new一个对象的时候,这个new关键字内部都干了什么呢? 现在我们就来剖析一下原生JS中new关键字内部的工作原理. 2.原生 ...

  7. Java实现不遍历数组求和

    package com.jts.t1; /** * 不遍历数组求和 * 方法省略异常检查 */ public class Demo1 { public static void main(String[ ...

  8. Geotools求shapefile路网中任意两点之间最短路径的距离

    前言:之前在博问求助过这个问题.经过几天的思考,算是解决了(但仍有不足),另一方面对Geotools不是很熟,有些描述可能不正确,希望大家批评指正. 问题:作为一个新手,我并没有发现Geotools中 ...

  9. Python 基础之 I/O 模型

    一.I/O模型 IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接 ...

  10. Asp.net Core 系列之--4.事务、日志及错误处理

    ChuanGoing 2019-11-17 这篇原本时想把事务处理.日志处理.错误处理.授权于鉴权一并介绍完的,授权和鉴权我想结合自定义权限来介绍,全部放到这里篇幅可能太长,因此权限部分将会在下篇来介 ...