1、获取控件在整个屏幕的绝对位置
则y坐标为可见的状态栏高度+可见的标题栏高度+view左上角到标题栏底部的距离.
private int[] getXY(View view){
//View代表方法传入的控件
int[] viewLocation = new int[2];
view.getLocationInWindow(viewLocation);
int viewX = viewLocation[0]; // x 坐标
int viewY = viewLocation[1]; // y 坐标
return viewLocation;
}
2、获取控件在父布局内的相对坐标
private void getParentReaXY(View view){
int getLeft = view.getLeft();
int getTop = view.getTop();
int getBottom = view.getBottom();
int getRight = view.getRight();
}
3、关于scrollTo(int x, int y)与scrollBy(int x, int y)与setScrollX(int value)
和setScrollY(int value)与getScrollX()与getScrollY()的关系
*有一点特别重要,scroll的坐标系统是和安卓屏幕的坐标系统反过来的,即左边箭头为X轴正轴,向上Y轴为正轴
eg;tv_info.scrollBy(-100, -50);是控件里面的内容向右平移了100px,向下平移了50px。反着亦反。
关系主要是看一下这几个方法的源码就很清楚,一下是源码,可以看到
scrollBy方法是对scrollTo方法的封装,直接调用scrollTo只会调用一次,但是调用scrollBy可以一直调用
以下是调用scrollTo的打印
tv_info.scrollBy(-100, -50);
int getScrollX = tv_info.getScrollX();
int getScrollY = tv_info.getScrollY();
Log.d(TAG, "getScrollX=="+getScrollX);
Log.d(TAG, "getScrollY=="+getScrollY);
//在getScrollX==-100;
getScrollY==-50;
再次点击
getScrollX==-200;
getScrollY==-100;
tv_info.scrollTo(-100, -50);
int getScrollX = tv_info.getScrollX();
int getScrollY = tv_info.getScrollY();
Log.d(TAG, "getScrollX=="+getScrollX);
Log.d(TAG, "getScrollY=="+getScrollY);
//在getScrollX==-100;
getScrollY==-50;
再次点击
getScrollX==-100;
getScrollY==-50;
public void setScrollX(int value) {
scrollTo(value, mScrollY);
}
public void scrollBy(int x, int y) {
scrollTo(mScrollX + x, mScrollY + y);
}
public void scrollTo(int x, int y) {
if (mScrollX != x || mScrollY != y) {
int oldX = mScrollX;
int oldY = mScrollY;
mScrollX = x;
mScrollY = y;
invalidateParentCaches();
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
if (!awakenScrollBars()) {
postInvalidateOnAnimation();
}
}
}
public final int getScrollX() {
return mScrollX;
}
public final int getScrollY() {
return mScrollY;
}