得到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