对View.getTop getBottom getY getScrollY 的深刻理解
博客专区 > SuShine 的博客 > 博客详情
对View.getTop getBottom getY getScrollY 的深刻理解
SuShine 发表于2年前
对View.getTop getBottom getY getScrollY 的深刻理解
  • 发表于 2年前
  • 阅读 278
  • 收藏 1
  • 点赞 0
  • 评论 0

【腾讯云】买域名送云解析+SSL证书+建站!>>>   

摘要: 一个demo 彻底理解 View.getTop getBottom getHeight getY getScrollY getLeft getRight getWidth getX getScrollX

自己在自定义一个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

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 118
博文 394
码字总数 85153
×
SuShine
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: