您的位置:首页 > 移动开发 > Android开发

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的自身方法:

**
* 测试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却依然没有变化?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: