1、View的坐标
- /**
- * Top position of this view relative to its parent.
- *相对应父控件的top位置,单位为像素,即头部到父控件的距离
- * @return The top of this view, in pixels.
- */
- @ViewDebug.CapturedViewProperty
- public final int getTop() {
- return mTop;
- }
其它的getBottom,getLeft,getRight类似
图例:
2、点击View时MotionEvent的坐标
getRawY:表示相对于屏幕左上角的y坐标值(注意:这个屏幕左上角是手机屏幕左上角,不管activity是否有titleBar或是否全屏幕),
getY:表示相对于View自身左上角的y坐标
图例:
组合图:
由上图可知:
View到屏幕上边的距离=e.getRawY-.getY
Item到屏幕上边的距离=e.getRawY-e.getY+item.getTop
等等
我刚开始查阅资料时看到网上有人说:“实际上在当屏幕可以包裹内容的时候,他们的值是相等的,只有当view超出屏幕后,才能看出他们的区别:getMeasuredWidth()是实际View的大小,与屏幕无关,而getHeight的大小此时则是屏幕的大小。当超出屏幕后getMeasuredWidth()等于getWidth()加上屏幕之外没有显示的大小”
1、证明上述观点错误
首先为什么说上面的那种说法是错误的?我们来看例子看完例子你就会同意我的说法,我的思路是这样的
思路:在onWindowFocusChanged方法中控件都测量好了,可以获取控件的宽和高,我们可以不断的改变控件的宽和高直至超过屏幕的宽度此时打印getMeasuredWidth和getWidth的值。
代码很简单就是通过getMeasuredWidth方法和getWidth方法获取控件的宽度并打印
public class MainActivity extends Activity {
private Button btnTest;
private boolean isFocus=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main1);
btnTest=(Button) findViewById(R.id.btn_test);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if(!isFocus&&hasFocus){
Log.i("MainActivity","btnTest.getWidth="+btnTest.getWidth());
Log.i("MainActivity","btnTest.getMeasureWidth="+btnTest.getMeasuredWidth());
isFocus=true;
}
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/btn_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="测试一" />
</LinearLayout>
打印结果如下
我们看到当属性是wrap_content时宽度是64(这里的单位是px,这是480*320的模拟器此时1dp=1px),此时getWidth和getMeasuredWidth的值是相同的。
按照上面的说法,假如View的大小没有超出屏幕的大小那么这两个值是相同的,这样看来是没有错,但是我们再将布局文件中的btn_test的宽度改为1000dp让btn_test超出屏幕的大小此时的运行效果如下从运行效果 我们可以看到此时的button已经超出屏幕,因为button的文字已经看不到了,但是看打印结果呢?仍然都是1000。
getMeasuredWidth方法:在measure方法结束后getMeasuredWidth方法就会有值.所以此方法得到的是view的內容佔據的實際寬度。
getWidth方法:从源码中发现它的返回值是mRight-mLeft.这里的mRight和mLeft到底是什么呢?其实它是layout过程传过来的四个参数中的两个
getWidth方法是在layout方法完成后才有的值,所以说在自定义控件的时候在onLayout方法中一般采用getMeasuredWidth来获得控件的宽度,因为getMeasuredWidth在measure后就有了值,而getWidth在layout才有了值。而在除了onLayout方法中采用getMeasuredWidth方法外在其之外的其他地方一般采用getWidth方法来获取控件的宽度。