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座标.