得到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 理解坐标,位置概念 ...
随机推荐
- CentOS 下的邮件通知
利用Shell邮件通知 echo "邮件内容" |mail -s 邮件主题 收件人地址 echo "This is Test mail."|mail -s &q ...
- Z字形变换
将字符串 "PAYPALISHIRING" 以 Z 字形排列成给定的行数: P A H N A P L S I I G Y I R 之后从左往右,逐行读取字符:"PAHN ...
- ResourceBundle.getBundle方法demo
这个参考链接 http://blog.csdn.net/tgyman/article/details/56012706
- win10下sublime text3 使用view in browser的快捷鍵添加方式
key-binding-user,于是,我在那里输入: [ { "keys": ["ctrl+b"], "command": " ...
- 【转】tair与redis比较总结
1. Tair总述 1.1 系统架构 一个Tair集群主要包括3个必选模块:configserver.dataserver和client,一个可选模块:invalidserver.通常情况下,一个集群 ...
- 1257: [CQOI2007]余数之和
题目链接 bzoj1257: [CQOI2007]余数之和 题解 数论分块,乘等差数列求和 代码 #include<bits/stdc++.h> using namespace std; ...
- UVALive 7146 (贪心+少许数据结构基础)2014acm/icpc区域赛上海站
这是2014年上海区域赛的一道水题.请原谅我现在才发出来,因为我是在太懒了.当然,主要原因是我刚刚做出来. 其实去年我就已经看到这道题了,因为我参加的就是那一场.但是当时我们爆零,伤心的我就再也没有看 ...
- 关于输出螺旋矩阵的demo
输出类似 1 2 3 8 9 4 7 6 5 主要难点是如何找到表示的算法 我的理解是,先生成一个n*n的矩阵,然后再往里面塞数字,而塞的方法分别有四种:由左往右,由上往下,由右往左,由下往上,没塞完 ...
- Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) F. Souvenirs 线段树套set
F. Souvenirs 题目连接: http://codeforces.com/contest/765/problem/F Description Artsem is on vacation and ...
- Android学习笔记PreferenceFragment的使用
相信大家对Perference都比较熟悉了,也就是我们常说的偏好设置,首选项设置,可以保存一些数据,例如我们在上一次使用的时候的一些内容,希望在下一次启动后依然生效,而不需要再进行配置那么麻烦.一般这 ...