android坐标系,是自定义View的基石,必须要搞懂,不能含糊。

脑子里一定要时刻清楚是什么坐标(View边界坐标,点击事件的坐标?),坐标是相对于什么(相对于自己,相对于父类?)

干货引读:

https://cloud.tencent.com/developer/article/1326665

https://www.jianshu.com/p/38c2b70c1384

http://liuwangshu.cn/application/view/1-coordinate-system.html (作者:刘望舒)

易混淆点:

1.android View的getX getLeft getTranslateX的区别:

https://blog.csdn.net/y97524027/article/details/54409872
left是布局时决定的属性,在translationX的平移中和setX()的平移中left属性并不会发生改变,translationX平移会导致getX()值得改变,反过来一样。

left的值是视图的原始位置的左边界距其父元素的左边界的距离
translationX代表的就是视图距其原始位置在x轴方向移动的距离。

2.android中几种宽度的含义

getWidth() 是实际显示的宽度。(layout之后计算出)
getMeasureWidth() 是测量宽度,在布局之前计算出来的。(测量之后计算出)
getIntrinsicWidth() 是原有宽度,有时候原有宽度可能很大,但是实际上空间不够,所有效果上并没有那么大,这个方法可以获得原有宽度,可以辅助测量的时候选择合适的展示宽度。
getMinimumWidth() 是最小宽度,是XML参数定义里的 minWidth,也是一个辅助测量展示的参数。

避坑指南:

1.Activity中获取view的高度和宽度为0的原因以及解决方案

https://www.cnblogs.com/zl1991/p/5340199.html

要想获取到的width和height为真实有效的,作者说到了以下几种方法:

1)在该View的事件回调里使用,这时候该view已经被显示即被添加到DecorView上,如点击事件、触摸事件、焦点事件等。
view=findViewById(R.id.tv);  
    view.setOnClickListener(new OnClickListener() {  
        @Override  
        public void onClick(View v) {  
            int width = v.getWidth();  
        }  
    });
2)在activity被显示出来时即添加到了DecorView上时获取宽和高如onWindowFocusChanged() 回调方法
@Override  
  public void onWindowFocusChanged(boolean hasFocus) {  
    View iv1 = findViewById(R.id.iv1);  
View iv2=findViewById(R.id.iv2);  
String msg1="iv1' width:"+iv1.getWidth()+" height:"+iv1.getHeight()+"  measuredWidth:"+iv1.getMeasuredWidth()+"measuredHeight:"+iv1.getMeasuredHeight();  
String msg2="iv2' width:"+iv2.getWidth()+" height:"+iv2.getHeight()+"  measuredWidth:"+iv2.getMeasuredWidth()+"measuredHeight:"+iv2.getMeasuredHeight();  
i("onWindowFocusChanged() "+msg1);  
i("onWindowFocusChanged() "+msg2);  
    super.onWindowFocusChanged(hasFocus);  
  }
3)或在onResume方法最后开线程300毫秒左右后获取宽和高 因为onResume执行完后300毫秒后 界面就显示出来了

这种方法我不提倡,没有严谨性,不同性能的手机可能延时时间都不太一样。尽量不要为了完成任务这样敷衍了事,而错过了寻求真理的过程。

分类: view体系

1 条评论

wang · 2021年1月15日 下午4:09

发表回复

您的电子邮箱地址不会被公开。