⑴ android怎么获取bitmap左上角坐标
用ImageView来装载这个bitmap并且填满整个ImageView,再用imageview对象来获取坐标值,getX(),getY(),获取的就是左上角的坐标值
⑵ android中获得控件的位置(相对于布局文件)
正确的代码如下所示
java">TextViewtv=(TextView)findViewById(R.id.text);
tv.getViewTreeObserver().addOnGlobalLayoutListener(newOnGlobalLayoutListener(){
@Override
publicvoidonGlobalLayout(){
//这里执行获取位置大小操作
intleft=tv.getLeft();
inttop=tv.getTop();
intbottom=tv.getBottom();
intright=tv.getRight();
//tv相对于父布局的坐标就得出来了
}
}
view的位置和大小是通过onLayout和onMeasure方法计算出来的,执行到activity的onCreate()方法时,尚未开始计算控件的大小和位置,所以是取不到的
OnGlobalLayoutListener 是ViewTreeObserver的内部类,当一个视图树的布局发生改变时,可以被ViewTreeObserver监听到,这是一个注册监听视图树的观察者(observer),在视图树的全局事件改变时得到通知
除了OnGlobalLayoutListener ,ViewTreeObserver还有如下内部类:
interfaceViewTreeObserver.OnGlobalFocusChangeListener
当在一个视图树中的焦点状态发生改变时,所要调用的回调函数的接口类
interfaceViewTreeObserver.OnGlobalLayoutListener
当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,所要调用的回调函数的接口类
interfaceViewTreeObserver.OnPreDrawListener
当一个视图树将要绘制时,所要调用的回调函数的接口类
interfaceViewTreeObserver.OnScrollChangedListener
当一个视图树中的一些组件发生滚动时,所要调用的回调函数的接口类
interfaceViewTreeObserver.OnTouchModeChangeListener
当一个视图树的触摸模式发生改变时,所要调用的回调函数的接口类
⑶ android View坐标系:getX/getTranslation/getLeft
图中灰色矩形是320X480屏幕区域,绿色矩形是300X300的父View,实线黄色矩形是100X100的子View,虚线黄色矩形是实线矩形setTranslationX(100)/setTranslationY(100)之后的位置。
以下如无特别说明,所有的方法说明均是以实线黄色矩形作为参照。
getX()/getY()获取的是其左上角相对于父View(绿色矩形)的左上角坐标位置,图中getX()=100,getY()=100。
getTranslationX/Y获取的是当前View相对于其当前位置的偏移,向左为负值,向右为正值,因此对于实线黄色矩形来说getTranslationX()=0,getTranslationY()=0,而对于虚线黄色矩形来说getTranslationX()=100,getTranslationY()=100,translationX = getX()-getLeft(),修改translationX/Y的值,会导致getX/Y的变化。但是,如果修改X/Y的值并不会导致translationX/Y的变化,他们的值依然是0。
getLeft/Right/Top/Bottom,获取的是View相对于父View左侧/顶部的距离,图中实线黄色矩形的getLeft()=100,getRight()=200(红色线标识所示),getTop()=100,getBottom()=200(紫色线标识所示),该系列方法严格来讲控制的是View的尺寸而不是位置,因此在setX或者setTranslationX时虽然改变了View的位置,但是其Left/Right/Top/Bottom参数却没有改变。因此对于图中的虚线黄色矩形,getLeft/Right/Top/Bottom获取到的值依然是100/200/100/200,如果通过setLeft(0),setTop(0)方法将实线黄色矩形的left和top值修改为0,则该矩形的左上角会与父View(绿色矩形)的左上角重合,而该矩形的右下角不变,同时getLeft()=0,getTop()=0,getRight()=200,getTop()=200,getX()=0,getY()=0,getTranslationX()=0,getTranslationY()=0。