Android view setLeft setX验证总结
Android view使用需要重点关注2点:
1. 布局
2. 计算各个view的大小。
详细内容大家可以参考很多介绍android原理的书。
计算各个view的大小主要有2个目的:
1. 给需要显示的view计算屏幕尺寸。
2. 在多个view有层次时,方便计算可见和隐藏区域。
这个概念比较直接。
当计算完大小之后,就是计算应该把各个view放在那个位置上了。
现在我有如下需求:
设计一个类似360的浮动球。初始的时候,只有一半显示在屏幕左侧。当用户拖动的时候,可以显示完全。
这个本质上就是一个纯布局问题。
经过试验:
如果要让一个视图部分在屏幕外面,只能用setX方法。使用setLeft没有任何效果。
分析原因前,先理解下坐标系统。一个view需要布局,必须知道应该把这个view放在什么位置上。位置就是(x,y)(二维系统),需要知道x,y的值就必须知道坐标原点。当把view放在不同的坐标系统,就会得到不同的坐标原点。常见的有:
1. 相对应屏幕原点。
2. 相对于父窗口原点。
SetX:是设置相对于屏幕原点。
SetLeft:是设置相对于父窗口原点。
我在Activity中的onCreate方法中,设置setLeft,没有任何效果,设置setX能够成功。说明用setLeft来设置相对于父view的位置是不行的。经过试验,发现只有通过设置布局参数才可以。代码如下:
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
lp.setMargins(50,0, 0, 0);
tv.setLayoutParams(lp);
在网上搜索方案,大都介绍getLeft,很少有介绍setLeft的,猜测可能是该方法不常用,使用起来也可能有问题。
使用setX有个副作用,就是整个view都沿x轴偏移了。想到的解决方案是在onMeasure中,把view的宽度设置成屏幕宽度+偏移。这样可以保证view继续充满整个屏幕。(该方案还未验证)。
经验证,上述方案失败。正确的方案还是尽量不使用setX,而是用上面的setMargins方法。