Android View 体系坐标值 受margin 和 padding的影响
2018-01-25 22:35
621 查看
参考博客写在前面: http://blog.csdn.net/St_Chan/article/details/73801281#reply http://blog.csdn.net/chdjj/article/details/42293753 http://www.gcssloop.com/customview/CoordinateSystem http://blog.csdn.net/wxv111/article/details/50901199
看了上面几个大神的博客后,发现结论有点出入,于是自己动手做下测试。
一、View的自身方法:
(1)、测试代码布局如下:
(2)、测试自身margin:
测试代码:
测试结果:
结果:getLeft 和 getX的值都变化了。说明自身margin值的变化会影响到View的getLeft和getX值的变化。
(3)、测试自身padding:
测试代码:
测试结果:
结果:getLeft 和getX 都没改变。说明自身的padding值对View的getLeft 和getX没有影响。按上面几个大神的分析也可想而知不会有影响的。
(4)、测试父控件margin:
测试代码:
测试结果:
结果:getLeft和getX没有变化。这个是可想而知的,父控件的margin值并没有影响到子控件到父控件的值。
(5)、测试父控件padding:
测试代码:
测试结果:
结果:getLeft 和getX都变化了。因为子控件属于父控件的内容区域。所以父控件的padding值的改变肯定影响到View到父控件的距离。
也就是会导致getLeft和getX的改变。
二、View自身的 translationX
(1)、测试代码
测试结果
结果:getLeft没变,getX 和 getTranslation 变化了。刚好 也可以看到 getX = getLeft + getTranslation
只是值得思考的是,getX 也就是 View的坐标都变化了 那为什么他距离父控件的left却依然没有变化?
看了上面几个大神的博客后,发现结论有点出入,于是自己动手做下测试。
一、View的自身方法:
** * 测试View的坐标系 * * 结论: * * View中自身方法: view.getTop(); //获取子View左上角距父View顶部的距离 view.getLeft(); //获取子View左上角距父View左侧的距离 view.getBottom(); //获取子View右下角距父View顶部的距离 view.getRight(); //获取子View右下角距父View左侧的距离 view.getTranslationX():计算的是该View在X轴的偏移量。初始值为0,向左偏移值为负,向右偏移值为正。 view.getTranslationY():计算的是该View在Y轴的偏移量。初始值为0,向上偏移为负,向下偏移为正。 view.getX=view.getTranslationX()+view.getLeft() 相当于该view距离父容器左边缘的距离 view.getY=view.getTranslationY()+view.getTop() 前面四个值 和getX 、getY 随 1、父控件的padding变化,前面四个值 和getX 、getY 变化。而不受父控件的margin值的影响。 2、自身的margin值变化,前面四个值 和getX 、getY 变化。而不受自身padding值的影响。
(1)、测试代码布局如下:
<com.hlx.view.evanhlxcustomview.view.CustomLinearLayout android:id="@+id/c_ll" android:layout_width="match_parent" android:background="#f5f102" android:layout_height="match_parent" android:layout_marginTop="20dp"> <com.hlx.view.evanhlxcustomview.view.CustomView android:id="@+id/c_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="50px" android:src="@mipmap/mayun01" /> </com.hlx.view.evanhlxcustomview.view.CustomLinearLayout>
(2)、测试自身margin:
测试代码:
public void addMarginLeft(View view) { Log.i("ScrollTestActivity", "addMarginLeft before --> left : " + mCustomView.getLeft() + " getX : " + mCustomView.getX() + " getTranslationX: " + mCustomView.getTranslationX()); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); params.leftMargin = mCustomView.getLeft() + 100; mCustomView.setLayoutParams(params); mCustomView.postDelayed(new Runnable() { @Override public void run() { Log.i("ScrollTestActivity", "addMarginLeft after --> left : " + mCustomView.getLeft() + " getX : " + mCustomView.getX() + " getTranslationX: " + mCustomView.getTranslationX()); } }, 500); }
测试结果:
01-25 20:43:39.738 15886-15886/com.hlx.view.evanhlxcustomview I/ScrollTestActivity: addMarginLeft before --> left : 50 getX : 50.0 getTranslationX: 0.0 01-25 20:43:40.239 15886-15886/com.hlx.view.evanhlxcustomview I/ScrollTestActivity: addMarginLeft after --> left : 150 getX : 150.0 getTranslationX: 0.0 01-25 20:43:42.755 15886-15886/com.hlx.view.evanhlxcustomview W/ScrollTestActivity: --onUserInteraction-- -onUserInteraction- 01-25 20:43:42.875 15886-15886/com.hlx.view.evanhlxcustomview I/ScrollTestActivity: addMarginLeft before --> left : 150 getX : 150.0 getTranslationX: 0.0 01-25 20:43:43.375 15886-15886/com.hlx.view.evanhlxcustomview I/ScrollTestActivity: addMarginLeft after --> left : 250 getX : 250.0 getTranslationX: 0.0
结果:getLeft 和 getX的值都变化了。说明自身margin值的变化会影响到View的getLeft和getX值的变化。
(3)、测试自身padding:
测试代码:
public void addPaddingLeft(View view) { Log.i("ScrollTestActivity", "addPaddingLeft before --> left : " + mCustomView.getLeft() + " getX : " + mCustomView.getX() + " getTranslationX: " + mCustomView.getTranslationX()); int paddingLeft = mCustomView.getPaddingLeft() + 100; mCustomView.setPadding(paddingLeft, 0, 0, 0); mCustomView.postDelayed(new Runnable() { @Override public void run() { Log.i("ScrollTestActivity", "addPaddingLeft after --> left : " + mCustomView.getLeft() + " getX : " + mCustomView.getX() + " getTranslationX: " + mCustomView.getTranslationX()); } }, 500); }
测试结果:
01-25 20:47:41.956 15886-15886/com.hlx.view.evanhlxcustomview I/ScrollTestActivity: addPaddingLeft before --> left : 50 getX : 50.0 getTranslationX: 0.0 01-25 20:47:42.457 15886-15886/com.hlx.view.evanhlxcustomview I/ScrollTestActivity: addPaddingLeft after --> left : 50 getX : 50.0 getTranslationX: 0.0 01-25 20:47:46.115 15886-15886/com.hlx.view.evanhlxcustomview W/ScrollTestActivity: --onUserInteraction-- -onUserInteraction- 01-25 20:47:46.202 15886-15886/com.hlx.view.evanhlxcustomview I/ScrollTestActivity: addPaddingLeft before --> left : 50 getX : 50.0 getTranslationX: 0.0 01-25 20:47:46.702 15886-15886/com.hlx.view.evanhlxcustomview I/ScrollTestActivity: addPaddingLeft after --> left : 50 getX : 50.0 getTranslationX: 0.0
结果:getLeft 和getX 都没改变。说明自身的padding值对View的getLeft 和getX没有影响。按上面几个大神的分析也可想而知不会有影响的。
(4)、测试父控件margin:
测试代码:
public void addParentMarginLeft(View view) { Log.i("ScrollTestActivity", "addParentMarginLeft before --> left : " + mCustomView.getLeft() + " getX : " + mCustomView.getX() + " getTranslationX: " + mCustomView.getTranslationX()); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); params.leftMargin = mCustomLi.getLeft() + 100; mCustomLi.setLayoutParams(params); mCustomView.postDelayed(new Runnable() { @Override public void run() { Log.i("ScrollTestActivity", "addParentMarginLeft after --> left : " + mCustomView.getLeft() + " getX : " + mCustomView.getX() + " getTranslationX: " + mCustomView.getTranslationX()); } }, 500); }
测试结果:
01-25 20:52:03.314 15886-15886/com.hlx.view.evanhlxcustomview I/ScrollTestActivity: addParentMarginLeft before --> left : 50 getX : 50.0 getTranslationX: 0.0 01-25 20:52:03.814 15886-15886/com.hlx.view.evanhlxcustomview I/ScrollTestActivity: addParentMarginLeft after --> left : 50 getX : 50.0 getTranslationX: 0.0 01-25 20:52:05.018 15886-15886/com.hlx.view.evanhlxcustomview W/ScrollTestActivity: --onUserInteraction-- -onUserInteraction- 01-25 20:52:05.111 15886-15886/com.hlx.view.evanhlxcustomview I/ScrollTestActivity: addParentMarginLeft before --> left : 50 getX : 50.0 getTranslationX: 0.0 01-25 20:52:05.611 15886-15886/com.hlx.view.evanhlxcustomview I/ScrollTestActivity: addParentMarginLeft after --> left : 50 getX : 50.0 getTranslationX: 0.0
结果:getLeft和getX没有变化。这个是可想而知的,父控件的margin值并没有影响到子控件到父控件的值。
(5)、测试父控件padding:
测试代码:
public void addParentPaddingLeft(View view) { Log.i("ScrollTestActivity", "addParentPaddingLeft before --> left : " + mCustomView.getLeft() + " getX : " + mCustomView.getX() + " getTranslationX: " + mCustomView.getTranslationX()); int paddingLeft = mCustomLi.getPaddingLeft() + 100; mCustomLi.setPadding(paddingLeft, 0, 0, 0); mCustomView.postDelayed(new Runnable() { @Override public void run() { Log.i("ScrollTestActivity", "addParentPaddingLeft after --> left : " + mCustomView.getLeft() + " getX : " + mCustomView.getX() + " getTranslationX: " + mCustomView.getTranslationX()); } }, 500); }
测试结果:
01-25 20:54:21.980 15886-15886/com.hlx.view.evanhlxcustomview I/ScrollTestActivity: addParentPaddingLeft before --> left : 50 getX : 50.0 getTranslationX: 0.0 01-25 20:54:22.480 15886-15886/com.hlx.view.evanhlxcustomview I/ScrollTestActivity: addParentPaddingLeft after --> left : 150 getX : 150.0 getTranslationX: 0.0 01-25 20:54:24.211 15886-15886/com.hlx.view.evanhlxcustomview W/ScrollTestActivity: --onUserInteraction-- -onUserInteraction- 01-25 20:54:24.297 15886-15886/com.hlx.view.evanhlxcustomview I/ScrollTestActivity: addParentPaddingLeft before --> left : 150 getX : 150.0 getTranslationX: 0.0 01-25 20:54:24.797 15886-15886/com.hlx.view.evanhlxcustomview I/ScrollTestActivity: addParentPaddingLeft after --> left : 250 getX : 250.0 getTranslationX: 0.0
结果:getLeft 和getX都变化了。因为子控件属于父控件的内容区域。所以父控件的padding值的改变肯定影响到View到父控件的距离。
也就是会导致getLeft和getX的改变。
二、View自身的 translationX
(1)、测试代码
public void ObjAnimation(View view) { ObjectAnimator.ofFloat(mCustomView, "translationX", 0, 100).setDuration(2000).start(); Log.i("ScrollTestActivity", " ObjAnimation before --> left : " + mCustomView.getLeft() + " getX : " + mCustomView.getX() + " getTranslationX: " + mCustomView.getTranslationX()); mCustomView.postDelayed(new Runnable() { @Override public void run() { Log.i("ScrollTestActivity", " ObjAnimation after --> left : " + mCustomView.getLeft() + " getX : " + mCustomView.getX() + " getTranslationX: " + mCustomView.getTranslationX()); } }, 3000); }
测试结果
01-25 21:00:00.408 15886-15886/com.hlx.view.evanhlxcustomview I/ScrollTestActivity: ObjAnimation before --> left : 50 getX : 50.0 getTranslationX: 0.0 01-25 21:00:03.409 15886-15886/com.hlx.view.evanhlxcustomview I/ScrollTestActivity: ObjAnimation after --> left : 50 getX : 150.0 getTranslationX: 100.0
结果:getLeft没变,getX 和 getTranslation 变化了。刚好 也可以看到 getX = getLeft + getTranslation
只是值得思考的是,getX 也就是 View的坐标都变化了 那为什么他距离父控件的left却依然没有变化?
相关文章推荐
- android自定义View之margin和padding的处理
- android 如何动态设置View的margin和padding
- Android布局中View的margin和padding的区别
- android自定义ViewGroup之瀑布流FlowLayout 简洁明了 支持padding和margin 100行代码搞定
- Android中View的事件体系(1)——坐标体系与移动
- android 如何动态设置View的margin和padding
- android 如何动态设置View的margin和padding
- android:padding和android:layout_margin的区别
- Android自定义控件热身——View的坐标位置和大小详解
- Android应用层(View体系)三
- Android中的坐标体系
- Android View measure (五) 支持margin属性,从一个异常说起
- View控件中android:drawablePadding不起作用的原因探究
- Android中的layout_margin和padding
- View控件中android:drawablePadding不起作用的原因探究
- 深入理解SVG坐标体系和transformations- viewport, viewBox,preserveAspectRatio
- android:padding和android:layout_margin的区别
- Android View(一)-View坐标以及方法说明
- android--获取view或者view事件发生的坐标的方法
- Android——View的事件体系(二)View的事件分发机制