这篇文章讲的方法全是再控件可以获取焦点的情况下执行的,如果在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坐标的各种方法的更多相关文章

  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. ADO.Net1

    一.ADO.Net 数据库连接技术 二.查询 1.步骤: 1)使用数据库空间:using System.Data.SqlClient; 2)连接数据库 3)创建数据库操作命令 4)输入操作命令 5)开 ...

  2. 当mysql 遇到 ctrl+c

    目的 为了理解MySQL在执行大SQL时,对执行CTRL+C产生的疑惑,本文通过实验测试和源码分析两个方面,对MySQL处理CTRL+C的详细过程进行分析和讲解,从而解除DBA及开发人员对CTRL+C ...

  3. CSS------当内容超出div宽度后自动换行和限制文字不超出div宽度和高度

    如图: 1.自动换行 </div> 2.限制宽高度 </div> (注意:如果div放在li中还需要加上display:inline-block属性)

  4. Element-ui el-cascader不触发prop?

    html代码: <el-form label-position="right" label-width="100px" :model="form ...

  5. P1757 通天之分组背包

    P1757 通天之分组背包背包中的经典问题,我竟然不知道.分组背包就是每个物品有一个所属的小组,小组内的物品会冲突.就是把01背包中的两个for换一下位置01:for(i,1,kind) for(j, ...

  6. SpringMVC(九) RequestMapping请求参数

    通过在控制器方法中使用@RequestParam(value="参数名",require=true/false,defaultvalue="")的方式,使在UR ...

  7. BZOJ 3812主旋律

    求一个图中强联通图的个数. 一看就是容斥啦,但这种二进制高端操作还是学习一下Candy?dalao 注释在代码里 好久没更了... #include<bits/stdc++.h> usin ...

  8. BZOJ.1061.[NOI2008]志愿者招募(线性规划 对偶原理 单纯形 / 费用流SPFA)

    题目链接 线性规划 用\(A_{ij}=0/1\)表示第\(i\)天\(j\)类志愿者能否被招募,\(x_i\)为\(i\)类志愿者招募了多少人,\(need_i\)表示第\(i\)天需要多少人,\( ...

  9. Xtreme9.0 - Car Spark 动态规划

    Car Spark 题目连接: https://www.hackerrank.com/contests/ieeextreme-challenges/challenges/car-spark Descr ...

  10. 机器学习算法(5):卷积神经网络原理及其keras实现

    1.原理 CNN的资料特别多,这里不再赘述,仅收集相关的资料供大家参考: a.Deep learning:五十一(CNN的反向求导及练习) b.Deep Learning 2.实现 我们使用keras ...