本文共 2215 字,大约阅读时间需要 7 分钟。
1、View的坐标
其它的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/