这篇文章讲的方法全是再控件可以获取焦点的情况下执行的,如果在oncreat()里面执行,那么得到的都是0

1.getLocationInWindow

这个方法得到的是view相对于当前Activity的左上角坐标。

例子:

如果你的view长宽为162,view现在正好位于屏幕的左上角,那么得到的结果是(0,162),就是view的左上角的坐标。

  1. //得到这个view左上角的坐标(相对于当前Activity)
  2. int[] position01 = new int[2];
  3. imageView.getLocationInWindow(position01);
  4. Log.d(tag, "getLocationInWindow:" + position01[0] + "," + position01[1]);

2.getLocationOnScreen

得到view相对于整个屏幕的左上角坐标,现在得到的是(0,162)

  1. //得到view的左上角坐标(相对于整个屏幕)
  2. int[] position02 = new int[2];
  3. imageView.getLocationOnScreen(position02);
  4. Log.d(tag, "getLocationOnScreen:" + position02[0] + "," + position02[1]);

这里获得的是view左上角x,y的绝对坐标,如果view超出了屏幕,得到的坐标就是负数

3.getGlobalVisibleRect

得到整体相对于屏幕的区域范围(Rect),这个rect表示当前view的范围。通过上面的分析,我们可以容易知道这个rect的各个坐标是:

(0,162——160,322)

  1. // 得到相对于整个屏幕的区域坐标(左上角坐标——右下角坐标)
  2. Rect viewRect = new Rect();
  3. imageView.getGlobalVisibleRect(viewRect);
  4. Log.d(tag, viewRect.toString());

通过这个方法得到的是view理论可见区域的大小,为什么说理论呢?因为如果view被某个view遮挡了,通过这个方法获得的结果还是一样的。注意下这个方法调用后会直接改变Rect的值,而且它还有个返回值。如果返回值是true,说明view全部或者一部分在屏幕中(即使被actionbar或者statusBar遮挡),这时得到的rect的宽高是在屏幕中的宽高,但坐标永远是大于0的,不会出现top或者left小于0的情况。如果返回的是false,那么说明这个view当前完全处于屏幕之外,并且这时候rect的宽高是view的本身宽高。

我为了得到view的绝对坐标和本身宽高写了这个方法,第二个方法没有进行详细的测试,仅仅说明意思。

  1. package com.kale.activityoptionstest;
  2.  
  3. import android.graphics.Rect;
  4. import android.view.View;
  5.  
  6. /**
  7. * @author:Jack Tony
  8. * @tips :得到view相对于屏幕的左上角的绝对坐标,还有view的本身宽高
  9. * 这个宽高和view当前显示的区域无关
  10. * @date :2014-11-24
  11. */
  12. public class Position {
  13.  
  14. public static Rect getGlobalVisibleRect(View v) {
  15. //得到view的左上角坐标(相对于整个屏幕)
  16. int[] position = new int[2];
  17. v.getLocationOnScreen(position);
  18. Rect mRect = new Rect();
  19. mRect.left = position[0];
  20. mRect.top = position[1];
  21. mRect.right = mRect.left + v.getWidth();
  22. mRect.bottom = mRect.top + v.getHeight();
  23. return mRect;
  24. }
  25.  
  26. /**
  27. * @param v
  28. * @return 得到view当前真实显示的位置和大小,超过屏幕显示的大小就是0
  29. */
  30. public static Rect getRealVisibleRect(View v) {
  31. //得到view的左上角坐标(相对于整个屏幕)
  32. int[] position = new int[2];
  33. v.getLocationOnScreen(position);
  34. Rect bounds = new Rect();
  35. boolean isInScreen = v.getGlobalVisibleRect(bounds);
  36. Rect mRect = new Rect();
  37. mRect.left = position[0];
  38. mRect.top = position[1];
  39. if (isInScreen) {
  40. mRect.right = mRect.left + bounds.width();
  41. mRect.bottom = mRect.top + bounds.height();
  42. }else {
  43. mRect.right = mRect.left;
  44. mRect.bottom = mRect.top;
  45. }
  46. return mRect;
  47. }
  48. }

4.getLocalVisibleRect

得到自己显示的区域,这个区域的坐标是相对自身的,仅仅用来表示自身所占的范围。左上角坐标一直为(0,0),右下角通过计算可得

(0,0——160,160)

  1. // 得到自己的可见的区域坐标,左上角坐标总是(0,0)
  2. Rect globeRect = new Rect();
  3. imageView.getLocalVisibleRect(globeRect);
  4. Log.d(tag, globeRect.toString());

5.相对父控件的坐标

下面的各种坐标全是相对于父控件的,是相对值。这些值取决于view在父控件中的位置,认为父控件的左上角永远是(0,0)

  1. //下面得到的坐标是相对于自己的父控件来说的,以父控件的左上角为(0,0)
  2. Log.d("demo", "X = "+ imageView.getX());
  3. Log.d("demo", "Y = "+ imageView.getY());
  4. Log.d("demo", "left:" + imageView.getLeft());
  5. Log.d("demo", "right:" + imageView.getRight());
  6. Log.d("demo", "Top:" + imageView.getTop());
  7. Log.d("demo", "Bottom:" + imageView.getBottom());

PS: 这些方法可以在按钮的onclick中进行执行,可以得到正确的结果。部分测试代码如下:

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3.  
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6.  
  7. imageView = (ImageView) findViewById(R.id.main_imageView);
  8.  
  9. Button btn = (Button) findViewById(R.id.test_button);
  10. btn.setOnClickListener(new OnClickListener() {
  11.  
  12. @Override
  13. public void onClick(View v) {
  14. // TODO 自动生成的方法存根
  15. getXY();
  16.  
  17. }
  18. });
  19.  
  20. }
  21.  
  22. protected void getXY() {
  23.  
  24. //得到这个view左上角的坐标(相对于当前Activity)
  25. int[] position01 = new int[2];
  26. imageView.getLocationInWindow(position01);
  27. Log.d(tag, "getLocationInWindow:" + position01[0] + "," + position01[1]);
  28.  
  29. //得到view的左上角坐标(相对于整个屏幕)
  30. int[] position02 = new int[2];
  31. imageView.getLocationOnScreen(position02);
  32. Log.d(tag, "getLocationOnScreen:" + position02[0] + "," + position02[1]);
  33.  
  34. // 得到相对于整个屏幕的区域坐标(左上角坐标——右下角坐标)
  35. Rect viewRect = new Rect();
  36. imageView.getGlobalVisibleRect(viewRect);
  37. Log.d(tag, viewRect.toString());
  38.  
  39. // 得到自己的可见的区域坐标,左上角坐标总是(0,0)
  40. Rect globeRect = new Rect();
  41. imageView.getLocalVisibleRect(globeRect);
  42. Log.d(tag, globeRect.toString());
  43.  
  44. //下面得到的坐标是相对于自己的父控件来说的,以父控件的左上角为(0,0)
  45. Log.d("demo", "X = "+ imageView.getX());
  46. Log.d("demo", "Y = "+ imageView.getY());
  47. Log.d("demo", "left:" + imageView.getLeft());
  48. Log.d("demo", "right:" + imageView.getRight());
  49. Log.d("demo", "Top:" + imageView.getTop());
  50. Log.d("demo", "Bottom:" + imageView.getBottom());
  51. }

参考自:http://www.fengfly.com/plus/view-209439-1.html

得到view坐标的各种方法的更多相关文章

  1. Android View坐标Left, Right, Top, Bottom

    Android View坐标Left, Right, Top, Bottom 1.分析说明Left, Right, Top, Bottom View中对于该字段说明如下,相对父布局的的位置 相对父布局 ...

  2. view坐标_ _ Android应用坐标系统全面详解

    转:http://blog.csdn.net/yanbober/article/details/50419117 1 背景 去年有很多人私信告诉我让说说自定义控件,其实通观网络上的很多博客都在讲各种自 ...

  3. Android必知必会-获取View坐标和长宽的时机

    如果移动端访问不佳,请访问–>Github版 背景 最近要实现一个功能,用到了一些属性动画,需要获取一些View的坐标信息,设计图如下: 这里我使用的是DialogFragment来实现的,可以 ...

  4. Android View体系(二)实现View滑动的六种方法

    1.View的滑动简介 View的滑动是Android实现自定义控件的基础,同时在开发中我们也难免会遇到View的滑动的处理.其实不管是那种滑动的方式基本思想都是类似的:当触摸事件传到View时,系统 ...

  5. MyEclipse Server view报错解决方法

    MyEclipse Server view报错解决方法 方法/步骤     启动MyEclipse,弹出一个框,报错. ---------------------------------------- ...

  6. 实现View的移动的方法总结

    btw:这篇博客的内容其实算是<Android开发艺术探索>的一篇读书笔记,在书本的知识上加了一点自己的理解,并用自己的话描述出来.<Android开发艺术探索>是一本不错的书 ...

  7. Android -- View移动的六种方法

    layout() 如果你将滑动后的目标位置的坐标传递给layout(),这样子就会把view的位置给重新布置了一下,在视觉上就是view的一个滑动的效果. public class DragView ...

  8. web view调h5的方法死活调不到

    (WebViewJavascriptBridge注册方法都能调用,只有callhandlename时无论如何也没响应)这个问题真是纠缠我好久了 webview评论区刷新问题终于找到原因了 ,我试着把咨 ...

  9. Android View坐标getLeft, getRight, getTop, getBottom

    1  引起疑惑 分析视图invalidate流程的过程中发现view的left, right, top, bottom跟自己理解的不一样,现在想分析一下这几个值具体的含义. 2  理解坐标,位置概念 ...

随机推荐

  1. JS实现集合和ECMA6集合

    集合类似于数组,但是集合中的元素是唯一的,没有重复值的.就像你学高中数学的概念一样,集合还可以做很多比如,并集,交集,差集的计算.在ECMA6之前,JavaScript没有提供原生的Set类,所以只能 ...

  2. java & android 开发规范手册

    阿里巴巴Java开发手册(终极版)https://pan.baidu.com/s/1c1UQM7Q 阿里巴巴Java开发规约插件p3cGitHub:https://github.com/alibaba ...

  3. ASP.Net1

    一.Web应用程序与传统桌面应用程序的不同: 1.产品级的Web应用程序总是包括至少两台联网的机器:一台承载网站,另一台在Web浏览器中查看数据. 即:我们通过自己的电脑浏览Web程序,这个程序会向服 ...

  4. 【PAT】1103 Integer Factorization(30 分)

    The K−P factorization of a positive integer N is to write N as the sum of the P-th power of K positi ...

  5. ps不显示命令本身的进程号

    当我们查看某个服务的进程时候,它会把命令本身的进程显示出来.如下图: 进程号2383 就是我命令本身的进程号,和我实际想看的进程无关 特别是在我们写脚本,kill进程时候会报错: 解决办法可以优化脚本 ...

  6. java json和对象互相装换

    java json和对象互相装换 1.com.alibaba.fastjson.JSON 2.com.fasterxml.jackson.databind.ObjectMapper

  7. 【Vue实战之路】一、Vue-cli入门及Vue工程目录全解。

    全面的Vue-cli学习,这一篇就够了! 一.下载 使用vue-cli前,需先安装node.js,node的安装就不赘述,不过在此需要注意: 1. node版本需在4.x以上,首推6.x以上版本(no ...

  8. collectionView代理方法快速设置cell大小上下左右间隔

    #define JianGe 25 #define GeShu 4 #define ScreenWidth ([UIScreen mainScreen].bounds.size.width) #def ...

  9. Django Model._meta API

    Model._meta API是Django ORM的核心,它使得lookups.queries.forms.admin这些模块通过每个model类的_meta的属性可以了解每个model的情况. 1 ...

  10. CentOS 7 yum 安装mysql5.6

    到mysql社区安装当前可用包 Centos  7  命令 # rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noar ...