得到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 理解坐标,位置概念 ...
随机推荐
- 《python源码剖析》,看看
这书高级了,有点超出理解能力. 但走出舒适区,不是大家都在说的么?:) 看完了些章节,还是很有收获的, 截图存照.
- React 与 Redux 在生产环境中的实践总结
React 与 Redux 在生产环境中的实践总结 前段时间使用 React 与 Redux 重构了我们360netlab 的 开放数据平台.现将其中一些技术实践经验总结如下: Universal 渲 ...
- Codeforces Round #355 (Div. 2) D. Vanya and Treasure
题目大意: 给你一个n × m 的图,有p种宝箱, 每个点上有一个种类为a[ i ][ j ]的宝箱,a[ i ][ j ] 的宝箱里有 a[ i ][ j ] + 1的钥匙,第一种宝箱是没有锁的, ...
- MySQL 实现将一个库表里面的数据实时更新到另一个库表里面
MySQL 实现将一个库表里面的数据实时更新到另一个库表里面 需求描述:MySQL 里面有很多的数据库,这些数据库里面都有同一种表结构的表 (tb_warn_log),这张表的数据是实时更新的,现在需 ...
- JAVA死锁的写法
在java开发中,避免不了要加锁控制程序逻辑,但加锁有可能导致死锁,造成线程永远卡死在等待释放锁,后面的代码得不到执行: 在java里,一般是通过synchronized关键字加锁,在jdk1.5版本 ...
- Linux-C基础编程
GCC工作流程 工作流程 1.预处理 -E xxx.c —> xxx.i 宏替换:头文件展开:注释去掉: gcc -E hello.c -o hello.i 2.编译 -S xxx.i —> ...
- 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 既然前后端 ...
- python语法(四)— 文件操作
前面几天学习了一写python的基础语法,也学习了分支if,循环while和for.由于之前已经做过几年的开发了,所以我们知道,许多数据来源并不是靠键盘输入到程序中去的,而是通过数据库和文件来获取到的 ...
- C# SqlHerper
1.C# SqlHelper public static class SqlHelper { private static readonly string conStr = Configuration ...
- Codeforces Round #371 (Div. 2) A. Meeting of Old Friends 水题
A. Meeting of Old Friends 题目连接: http://codeforces.com/contest/714/problem/A Description Today an out ...