文档章节

对View.getTop getBottom getY getScrollY 的深刻理解

SuShine
 SuShine
发布于 2016/07/23 11:17
字数 599
阅读 332
收藏 1

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

 

© 著作权归作者所有

共有 人打赏支持
SuShine
粉丝 123
博文 498
码字总数 144879
作品 0
朝阳
后端工程师
getRawX、getRawY与getX、getY以及getScrollX、getScrollY

图解MotionEvent中getRawX、getRawY与getX、getY以及View中的getScrollX、getScrollY 1.getRawX、getRawY与getX、getY的区别 在编写android的自定义控件,或者判断用户手势操作时,往往需要使...

aspirs
2016/02/01
89
0
ScrollView反弹效果的实现

View中也有scrollBy和scrollTo这两个方法,但是ScrollView对scrollTo进行重写 由于:publicvoid scrollBy(int x,int y) { scrollTo(mScrollX + x, mScrollY + y); } View:publicvoid scroll......

长平狐
2012/08/09
272
0
ScrollView反弹效果的实现

View中也有scrollBy和scrollTo这两个方法,但是ScrollView对scrollTo进行重写 由于:publicvoid scrollBy(int x,int y) { scrollTo(mScrollX + x, mScrollY + y); } View:publicvoid scroll......

长平狐
2012/08/21
479
0
ScrollView反弹效果的实现

View中也有scrollBy和scrollTo这两个方法,但是ScrollView对scrollTo进行重写 由于:publicvoid scrollBy(int x,int y) { scrollTo(mScrollX + x, mScrollY + y); } View:publicvoid scroll......

长平狐
2012/08/14
345
0
仿淘宝的商品详情拖动,ViewPager和ScrollView WebView的滑动冲突

仿淘宝的商品详情拖动遇到的问题。使用结构就是DirectionalViewPager 嵌套了(1)ScrollView (2)WebView 情况:竖直方向的ViewPager DirectionalViewPager 嵌套了(1)ScrollView (2)WebView...

Gemini-Lin
2015/09/01
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

74.expect脚本同步文件以及指定host同步文件 构建分发系统文件和命令

20.31 expect脚本同步文件: 在expect脚本中去实现在一台机器上把文件同步到另外一台机器上去。核心命令用的是rsync ~1.自动同步文件 #!/usr/bin/expect set passwd "123456" spawn rsync -a...

王鑫linux
17分钟前
0
0
TypeScript项目引用(project references)

转发 TypeScript项目引用(project references) TypeScript新特性之项目引用(project references) 项目引用是TypeScript 3.0中的一项新功能,允许您将TypeScript程序构建为更小的部分。 通过这...

durban
21分钟前
0
0
爬虫入门

导读 网络爬虫(Web crawler),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,它们被广泛用于互联网搜索引擎或其他类似网站,可以自动采集所有其能够访问到的页面内容,以获取...

问题终结者
21分钟前
0
0
ppwjs之bootstrap文字排版:无序列表项不换行

<!DOCTYPT html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>ppwjs欢迎您</title><link rel="icon" href="/favicon.ico" ......

ppwjs
28分钟前
0
0
SpringBoot 学习一

本文将从以下几个方面介绍: 前言 HelloWorld 读取配置文件 例子(CURD) 前言 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架...

tsmyk0715
28分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部