得到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 理解坐标,位置概念 ...
随机推荐
- k8s中新建一个namespace和harborsecret的yaml文件
注意哟, 不同的harborsecret,在不同的namespace中,是不共用的. 也就是说,如果在default名字空间中,创建了一个docker login secret, 在其它名字空间中,是 ...
- Hive的安装和使用
1.Hive1.1 在hadoop生态圈中属于数据仓库的角色.他能够管理hadoop中的数据,同时可以查询hadoop中的数据. 本质上讲,hive是一个SQL解析引擎.Hive可以把SQL查询转换为 ...
- sqlite读写
#coding=utf-8 import sqlite3 import os #创建数据库和游标 if os.path.exists(' test.db'): conn=sqlite3.connect ...
- chrome使用技巧(转)
原文:http://www.cnblogs.com/liyunhua/p/4544738.html 阅读目录 写在前面 快速切换文件 在源代码中搜索 在源代码中快速跳转到指定的行 使用多个插入符进行选 ...
- 001.DHCP简介
一 DHCP概念 DHCP指动态主机配置协议,是一个局域网的网络协议,使用UDP协议工作. 二 应用 为大量客户机自动分配地址,提供集中管理 减轻管理和维护成本,提高网络配置效率 三 分配的主要信息 ...
- 网络数据包信息收集工具ferret-sidejack
网络数据包信息收集工具ferret-sidejack 网络数据包传递用户的各种操作和对应的信息.但是由于各种数据混在一起,不利于渗透测试人员分析.Kali Linux提供了一款信息搜集工具ferr ...
- 运行程序,解读this指向---case4
var param = 'window'; var obj1 = { param: 'obj1', fn1: function () { console.log(this.param); }, fn2 ...
- 面向对象设计原则 里氏替换原则(Liskov Substitution Principle)
里氏替换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一. 里氏替换原则中说,任何基类可以出现的地方,子类一定可以出现. LSP是继承复用的基石,只 ...
- BZOJ.3058.四叶草魔杖(Kruskal 状压DP)
题目链接 \(2^{16}=65536\),可以想到状压DP.但是又有\(\sum A_i\neq 0\)的问题.. 但是\(2^n\)这么小,完全可以枚举所有子集找到\(\sum A_i=0\)的, ...
- 2010-2011 ACM-ICPC, NEERC, Moscow Subregional Contest Problem C. Contest 水题
Problem C. Contest 题目连接: http://codeforces.com/gym/100714 Description The second round of the annual ...