得到view坐标的各种方法
这篇文章讲的方法全是再控件可以获取焦点的情况下执行的,如果在oncreat()里面执行,那么得到的都是0
1.getLocationInWindow
这个方法得到的是view相对于当前Activity的左上角坐标。
例子:
如果你的view长宽为162,view现在正好位于屏幕的左上角,那么得到的结果是(0,162),就是view的左上角的坐标。
- //得到这个view左上角的坐标(相对于当前Activity)
- int[] position01 = new int[2];
- imageView.getLocationInWindow(position01);
- Log.d(tag, "getLocationInWindow:" + position01[0] + "," + position01[1]);
2.getLocationOnScreen
得到view相对于整个屏幕的左上角坐标,现在得到的是(0,162)
- //得到view的左上角坐标(相对于整个屏幕)
- int[] position02 = new int[2];
- imageView.getLocationOnScreen(position02);
- Log.d(tag, "getLocationOnScreen:" + position02[0] + "," + position02[1]);
这里获得的是view左上角x,y的绝对坐标,如果view超出了屏幕,得到的坐标就是负数
3.getGlobalVisibleRect
得到整体相对于屏幕的区域范围(Rect),这个rect表示当前view的范围。通过上面的分析,我们可以容易知道这个rect的各个坐标是:
(0,162——160,322)
- // 得到相对于整个屏幕的区域坐标(左上角坐标——右下角坐标)
- Rect viewRect = new Rect();
- imageView.getGlobalVisibleRect(viewRect);
- Log.d(tag, viewRect.toString());
通过这个方法得到的是view理论可见区域的大小,为什么说理论呢?因为如果view被某个view遮挡了,通过这个方法获得的结果还是一样的。注意下这个方法调用后会直接改变Rect的值,而且它还有个返回值。如果返回值是true,说明view全部或者一部分在屏幕中(即使被actionbar或者statusBar遮挡),这时得到的rect的宽高是在屏幕中的宽高,但坐标永远是大于0的,不会出现top或者left小于0的情况。如果返回的是false,那么说明这个view当前完全处于屏幕之外,并且这时候rect的宽高是view的本身宽高。
我为了得到view的绝对坐标和本身宽高写了这个方法,第二个方法没有进行详细的测试,仅仅说明意思。
- package com.kale.activityoptionstest;
- import android.graphics.Rect;
- import android.view.View;
- /**
- * @author:Jack Tony
- * @tips :得到view相对于屏幕的左上角的绝对坐标,还有view的本身宽高
- * 这个宽高和view当前显示的区域无关
- * @date :2014-11-24
- */
- public class Position {
- public static Rect getGlobalVisibleRect(View v) {
- //得到view的左上角坐标(相对于整个屏幕)
- int[] position = new int[2];
- v.getLocationOnScreen(position);
- Rect mRect = new Rect();
- mRect.left = position[0];
- mRect.top = position[1];
- mRect.right = mRect.left + v.getWidth();
- mRect.bottom = mRect.top + v.getHeight();
- return mRect;
- }
- /**
- * @param v
- * @return 得到view当前真实显示的位置和大小,超过屏幕显示的大小就是0
- */
- public static Rect getRealVisibleRect(View v) {
- //得到view的左上角坐标(相对于整个屏幕)
- int[] position = new int[2];
- v.getLocationOnScreen(position);
- Rect bounds = new Rect();
- boolean isInScreen = v.getGlobalVisibleRect(bounds);
- Rect mRect = new Rect();
- mRect.left = position[0];
- mRect.top = position[1];
- if (isInScreen) {
- mRect.right = mRect.left + bounds.width();
- mRect.bottom = mRect.top + bounds.height();
- }else {
- mRect.right = mRect.left;
- mRect.bottom = mRect.top;
- }
- return mRect;
- }
- }
4.getLocalVisibleRect
得到自己显示的区域,这个区域的坐标是相对自身的,仅仅用来表示自身所占的范围。左上角坐标一直为(0,0),右下角通过计算可得
(0,0——160,160)
- // 得到自己的可见的区域坐标,左上角坐标总是(0,0)
- Rect globeRect = new Rect();
- imageView.getLocalVisibleRect(globeRect);
- Log.d(tag, globeRect.toString());
5.相对父控件的坐标
下面的各种坐标全是相对于父控件的,是相对值。这些值取决于view在父控件中的位置,认为父控件的左上角永远是(0,0)
- //下面得到的坐标是相对于自己的父控件来说的,以父控件的左上角为(0,0)
- Log.d("demo", "X = "+ imageView.getX());
- Log.d("demo", "Y = "+ imageView.getY());
- Log.d("demo", "left:" + imageView.getLeft());
- Log.d("demo", "right:" + imageView.getRight());
- Log.d("demo", "Top:" + imageView.getTop());
- Log.d("demo", "Bottom:" + imageView.getBottom());
PS: 这些方法可以在按钮的onclick中进行执行,可以得到正确的结果。部分测试代码如下:
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- imageView = (ImageView) findViewById(R.id.main_imageView);
- Button btn = (Button) findViewById(R.id.test_button);
- btn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO 自动生成的方法存根
- getXY();
- }
- });
- }
- protected void getXY() {
- //得到这个view左上角的坐标(相对于当前Activity)
- int[] position01 = new int[2];
- imageView.getLocationInWindow(position01);
- Log.d(tag, "getLocationInWindow:" + position01[0] + "," + position01[1]);
- //得到view的左上角坐标(相对于整个屏幕)
- int[] position02 = new int[2];
- imageView.getLocationOnScreen(position02);
- Log.d(tag, "getLocationOnScreen:" + position02[0] + "," + position02[1]);
- // 得到相对于整个屏幕的区域坐标(左上角坐标——右下角坐标)
- Rect viewRect = new Rect();
- imageView.getGlobalVisibleRect(viewRect);
- Log.d(tag, viewRect.toString());
- // 得到自己的可见的区域坐标,左上角坐标总是(0,0)
- Rect globeRect = new Rect();
- imageView.getLocalVisibleRect(globeRect);
- Log.d(tag, globeRect.toString());
- //下面得到的坐标是相对于自己的父控件来说的,以父控件的左上角为(0,0)
- Log.d("demo", "X = "+ imageView.getX());
- Log.d("demo", "Y = "+ imageView.getY());
- Log.d("demo", "left:" + imageView.getLeft());
- Log.d("demo", "right:" + imageView.getRight());
- Log.d("demo", "Top:" + imageView.getTop());
- Log.d("demo", "Bottom:" + imageView.getBottom());
- }
参考自:http://www.fengfly.com/plus/view-209439-1.html
得到view坐标的各种方法的更多相关文章
- Android View坐标Left, Right, Top, Bottom
Android View坐标Left, Right, Top, Bottom 1.分析说明Left, Right, Top, Bottom View中对于该字段说明如下,相对父布局的的位置 相对父布局 ...
- view坐标_ _ Android应用坐标系统全面详解
转:http://blog.csdn.net/yanbober/article/details/50419117 1 背景 去年有很多人私信告诉我让说说自定义控件,其实通观网络上的很多博客都在讲各种自 ...
- Android必知必会-获取View坐标和长宽的时机
如果移动端访问不佳,请访问–>Github版 背景 最近要实现一个功能,用到了一些属性动画,需要获取一些View的坐标信息,设计图如下: 这里我使用的是DialogFragment来实现的,可以 ...
- Android View体系(二)实现View滑动的六种方法
1.View的滑动简介 View的滑动是Android实现自定义控件的基础,同时在开发中我们也难免会遇到View的滑动的处理.其实不管是那种滑动的方式基本思想都是类似的:当触摸事件传到View时,系统 ...
- MyEclipse Server view报错解决方法
MyEclipse Server view报错解决方法 方法/步骤 启动MyEclipse,弹出一个框,报错. ---------------------------------------- ...
- 实现View的移动的方法总结
btw:这篇博客的内容其实算是<Android开发艺术探索>的一篇读书笔记,在书本的知识上加了一点自己的理解,并用自己的话描述出来.<Android开发艺术探索>是一本不错的书 ...
- Android -- View移动的六种方法
layout() 如果你将滑动后的目标位置的坐标传递给layout(),这样子就会把view的位置给重新布置了一下,在视觉上就是view的一个滑动的效果. public class DragView ...
- web view调h5的方法死活调不到
(WebViewJavascriptBridge注册方法都能调用,只有callhandlename时无论如何也没响应)这个问题真是纠缠我好久了 webview评论区刷新问题终于找到原因了 ,我试着把咨 ...
- Android View坐标getLeft, getRight, getTop, getBottom
1 引起疑惑 分析视图invalidate流程的过程中发现view的left, right, top, bottom跟自己理解的不一样,现在想分析一下这几个值具体的含义. 2 理解坐标,位置概念 ...
随机推荐
- JS实现集合和ECMA6集合
集合类似于数组,但是集合中的元素是唯一的,没有重复值的.就像你学高中数学的概念一样,集合还可以做很多比如,并集,交集,差集的计算.在ECMA6之前,JavaScript没有提供原生的Set类,所以只能 ...
- java & android 开发规范手册
阿里巴巴Java开发手册(终极版)https://pan.baidu.com/s/1c1UQM7Q 阿里巴巴Java开发规约插件p3cGitHub:https://github.com/alibaba ...
- ASP.Net1
一.Web应用程序与传统桌面应用程序的不同: 1.产品级的Web应用程序总是包括至少两台联网的机器:一台承载网站,另一台在Web浏览器中查看数据. 即:我们通过自己的电脑浏览Web程序,这个程序会向服 ...
- 【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 ...
- ps不显示命令本身的进程号
当我们查看某个服务的进程时候,它会把命令本身的进程显示出来.如下图: 进程号2383 就是我命令本身的进程号,和我实际想看的进程无关 特别是在我们写脚本,kill进程时候会报错: 解决办法可以优化脚本 ...
- java json和对象互相装换
java json和对象互相装换 1.com.alibaba.fastjson.JSON 2.com.fasterxml.jackson.databind.ObjectMapper
- 【Vue实战之路】一、Vue-cli入门及Vue工程目录全解。
全面的Vue-cli学习,这一篇就够了! 一.下载 使用vue-cli前,需先安装node.js,node的安装就不赘述,不过在此需要注意: 1. node版本需在4.x以上,首推6.x以上版本(no ...
- collectionView代理方法快速设置cell大小上下左右间隔
#define JianGe 25 #define GeShu 4 #define ScreenWidth ([UIScreen mainScreen].bounds.size.width) #def ...
- Django Model._meta API
Model._meta API是Django ORM的核心,它使得lookups.queries.forms.admin这些模块通过每个model类的_meta的属性可以了解每个model的情况. 1 ...
- CentOS 7 yum 安装mysql5.6
到mysql社区安装当前可用包 Centos 7 命令 # rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noar ...