文档章节

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

SuShine
 SuShine
发布于 2016/07/23 11:17
字数 599
阅读 346
收藏 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
粉丝 128
博文 590
码字总数 158440
作品 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
104
0
仿淘宝的商品详情拖动,ViewPager和ScrollView WebView的滑动冲突

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

Gemini-Lin
2015/09/01
1K
0
图解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()

Android系统手机屏幕的左上角为坐标系,同时y轴方向与笛卡尔坐标系的y轴方向想反。通过提供的api如getLeft , getTop, getBottom, getRight可以获得控件在parent中的相对位置。同时,也可以获...

微笑的江豚
2016/08/05
19
0
Android getTop, getRight, getLeft, getBottom

getTop: View自身的顶边到其父布局顶边的距离 getLeft: View自身的左边到其父布局左边的距离 getRight:View自身右边到其父布局左边的距离 getBottom: View自身底边到期父布局顶边的距离 ge...

whitemine
2016/08/02
64
0
Android实现滑动的几种方法

转载自『开心阳』http://blog.csdn.net/shakespeare001/article/details/51657795 下面通过一个例子来总结实现滑动的几种方式,例子的主要功能就是让我们的自定义View能够随着手指的移动而移...

addcn
2016/06/21
18
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
6
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
7
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
9
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部