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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM