zoukankan      html  css  js  c++  java
  • 得到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

  • 相关阅读:
    read、write 与recv、send区别 gethostname
    网络粘包问题解决办法
    C++中 =default 和 =delete 使用
    c++ unordered_map 自定义key
    c++ list的坑
    c++ vector 的坑
    对于RBAC与shiro的一些思考
    求两个数的最大公约数&求N个数的最大公约数
    Nginx是什么?有什么用?
    如何做可靠的分布式锁,Redlock真的可行么
  • 原文地址:https://www.cnblogs.com/tianzhijiexian/p/4097225.html
Copyright © 2011-2022 走看看