Android中View位置

View提供的获取座标方法
getTop() 获取View自身的顶边到父布局顶边的距离
getLeft() 获取View自身的左边到父布局左边的距离
getRight() 获取View自身的右边到父布局左边的距离
getBottom() 获取View自身的底边到父布局顶边的距离

示例

 <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
        <RelativeLayout
            android:id="@+id/rl"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:layout_marginTop="50dp"
            android:layout_marginLeft="50dp"
            android:background="@color/green"
            >
            <TextView
                android:text="A"
                android:gravity="center"
                android:id="@+id/tv"
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:layout_marginLeft="100dp"
                android:layout_marginTop="100dp"
                android:background="#ff0000"
                />
        </RelativeLayout>

    </LinearLayout>

Activity中取数据

new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);


                    mTv.getLeft();
                    mTv.getRight();
                    mTv.getTop();
                    mTv.getBottom();

                    Log.e(TAG, "initView:  Left " + mTv.getLeft() + " px");
                    Log.e(TAG, "initView:  Right " + mTv.getRight() + " px");
                    Log.e(TAG, "initView:  Top " + mTv.getTop() + " px");
                    Log.e(TAG, "initView:  Bottom " + mTv.getBottom() + " px");

                    Log.e(TAG, "initView:  转换为dp  Left " + px2dp(mTv.getLeft()) + " dp");
                    Log.e(TAG, "initView:  转换为dp  Right " + px2dp(mTv.getRight()) + " dp");
                    Log.e(TAG, "initView:  转换为dp  Top " + px2dp(mTv.getTop()) + " dp");
                    Log.e(TAG, "initView:  转换为dp  Bottom " + px2dp(mTv.getBottom()) + " dp");

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

如图
在这里插入图片描述在这里插入图片描述

MotionEvent

在手指触摸屏幕的过程中,典型的事件类型有以下几种
ACTION_DOWN 手指接触屏幕
ACTION_MOVE 手指在屏幕上移动
ACTION_UP 手机从屏幕上松开的瞬间

getX() 获取点击处View距离当前控件左边的距离
getY() 获取点击处View距离当前控件顶边的距离
getRawX() 获取点击处View距离整个屏幕左边的距离
getRawY() 获取点击处View距离整个屏幕顶边的距离

布局

		<RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:layout_marginTop="50dp"
            android:layout_marginLeft="50dp"
            android:layout_marginRight="50dp"
            android:background="@color/green"
            >
            <TextView
             	android:text="B"
                android:gravity="center"
                android:id="@+id/tv_yellow"
                android:layout_width="150dp"
                android:layout_height="150dp"
                android:layout_marginLeft="20dp"
                android:layout_marginTop="20dp"
                android:background="#FFFF00"
                />
        </RelativeLayout>

Acitivity中


   mTvYellow.setOnTouchListener(mOnTouchListener);

    private int lastX;
    private int lastY;
    private int startLeft;
    private int startRight;
    private int startTop;
    private int startBottom;

    View.OnTouchListener mOnTouchListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            int action = event.getAction();
            //获取手机触摸的座标
            int x = (int) event.getX();
            int y = (int) event.getY();
            int rawx = (int) event.getRawX();
            int rawy = (int) event.getRawY();
            Log.e(TAG, "onTouch: _x: "+x +"   ___  y: "+y);
            Log.e(TAG, "onTouch: rawx: "+rawx +"   ___  rawy: "+rawy);
            switch (action){
                case MotionEvent.ACTION_DOWN://按下,获取View初始的位置
                    startLeft = v.getLeft();
                    startRight = v.getRight();
                    startTop = v.getTop();
                    startBottom = v.getBottom();
                    lastX = x;
                    lastY = y;
                    break;
                case MotionEvent.ACTION_MOVE://移动,View跟随手指的移动
                    int offsetX = x - lastX;
                    int offsetY = y - lastY;
                    v.layout(v.getLeft()+offsetX,v.getTop()+offsetY,
                            v.getRight()+offsetX,v.getBottom()+offsetY);
                    break;
                case MotionEvent.ACTION_UP://当手指擡起时,回到View初始的位置
                    v.layout(startLeft, startTop, startRight, startBottom);
                    break;
            }
            return true;
        }
    };

在这里插入图片描述
即getX/getY返回的是相对于当前View左上角的x和y座标,
而getRawX/getRawY返回的是相对于手机屏幕左上角的x和y座标.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章