博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
View的顶点坐标以及getMeasuredWidth和getWidth
阅读量:3983 次
发布时间:2019-05-24

本文共 2215 字,大约阅读时间需要 7 分钟。

1、View的坐标

[java] 
 
  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;    	}

打印结果如下


我们看到当属性是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方法来获取控件的宽度。

转载地址:http://dupui.baihongyu.com/

你可能感兴趣的文章
No.55 - leetcode983 - 买票-简单dp
查看>>
No.56 - leetcode413 - 等差子串个数
查看>>
网络:TCP三次握手四次挥手
查看>>
网络:TCP可靠性传输
查看>>
网络:syn flood攻击
查看>>
Thinking in java(六)
查看>>
Thinking in java(七)
查看>>
StringBuffer、StringBuilder与为什么说StringBuilder是不安全的
查看>>
《java 编程思想》 读书笔记 (一)
查看>>
eclipse注释乱码的一个小问题
查看>>
《java 编程思想》 读书笔记 (二)
查看>>
order by与索引
查看>>
Thinking in java(八)-正则表达式
查看>>
DB2 SQL7008问题
查看>>
高性能JSON框架之FastJson的简单使用
查看>>
SQL中使用正则的一个栗子
查看>>
SQL语句与正则表达式
查看>>
ResourceBundle来读取配置文件及路径问题
查看>>
ibatis 与 sql 的问题
查看>>
onclick="return checkForm()" 、onclick="checkForm();return false;"解析 与 return false;
查看>>