得到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());
    }
复制代码

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值