View的顶点坐标以及getMeasuredWidth和getWidth

1、View的坐标

[java]  view plain  copy
  1. /** 
  2.  * Top position of this view relative to its parent. 
  3.  *相对应父控件的top位置,单位为像素,即头部到父控件的距离 
  4.  * @return The top of this view, in pixels. 
  5.  */  
  6. @ViewDebug.CapturedViewProperty  
  7. public final int getTop() {  
  8.     return mTop;  
  9. }  

其它的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方法来获取控件的宽度。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值