自己在自定义一个view, 自己来控制焦点, 使用scroll 来控制滚动
发觉自己对 View.getTop getBottom getHeight getY getScrollY 并不是很
精通, 于是今天抽空研究了一下
linearLayout 是图中蓝色部分
button是我在linearLayout中添加的按钮, 注意需要使用addView(View v, LayoutParams params) 这个函数.
代码如下
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, 200);
params.topMargin = 30;
linearLayout1.addView(button1, params);
linearLayout1.addView(button2, params);
linearLayout1.addView(button3, params);
linearLayout1.addView(button4, params);
linearLayout1.addView(button5, params);
如果使用addView(View) , Layout会自己计算, 如果孩子总高度超过了自己的高度, 会把孩子压缩了, 如图二 , button4被压缩 然而 button5 呢?原因是我们没有指定params, layout或使用按钮默认的params , 其高度是 wrapcontent, 既然放不下, 那button5 就不见了: addView源码如下:
public void More ...addView(View child, int index) {
LayoutParams params = child.getLayoutParams();
if (params == null) {
params = generateDefaultLayoutParams(); //默认的params
if (params == null) {
throw new IllegalArgumentException("generateDefaultLayoutParams() cannot return null");
}
}
addView(child, index, params);
}
通过图1 我们分析到
1. getY = getTop , 也就是蓝色linearLayout相对绿色父亲的位置, 通过button1的top我们知道, view的top 需要把 margin计算上: 本例子中button1 的top 也就是 button1 相对于蓝色linearLayout的topMargin
2.getBottom 就是这个view底部相对父亲的距离
3.getHeight = getBottom - getTop
4.getScrollY = 0 因为view没滚
ok 开始滚吧
图一是向上滚动, 代码 linearLayout1.scrollBy(0, 50); 每次都动那么一点
图二是向下滚动, 代码 linearLayout1.scrollBy(0, -50); 每次都动那么一点
图三是向下滚动到指定位置: 代码: linearLayout1.scrollTo(0, -300); 就动一次
在图二中 红色那一块表示topMargin, 黑色部分就是滚动的距离, 也就是 200
观察孩子们的 top x等, 发现没有任何变化
由此得出结论:
1.scrollBy 中的值, 正数向上滚动, 负数向下滚动 没执行一次, 滚动 value个像素. scrollTo 直接滚到那个地方
2.scroll不过是layout的视角发生了变化, 孩子们实际上是没有任何位置改变的.
额外福利, 如果想实现类似listview的平滑滚动, 就要用到scroller了. 此分析在下一篇中介绍
也可以参考: http://www.cnblogs.com/hellomagic/p/5233378.html
demo下载 链接: http://pan.baidu.com/s/1eRVLtuE 密码: 7xu7