文档章节

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

SuShine
 SuShine
发布于 2016/07/23 11:17
字数 599
阅读 342
收藏 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
博文 538
码字总数 153323
作品 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
仿淘宝的商品详情拖动,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
4
0
Android getTop, getRight, getLeft, getBottom

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

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

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

addcn
2016/06/21
14
0

没有更多内容

加载失败,请刷新页面

加载更多

Ugly Number(leetcode263)

Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. Example 1: Input: 6Output: true......

woshixin
13分钟前
0
0
深度模型从研者 眼里的 似然估计 & Hessain 海森矩阵 & Fisher Information (费雪信息)

深度模型的训练的基本依据是最小化模型拟合数据的误差。旨在不仅知其然(如何构建和训练一个深度模型),还应知其所以然(为什么这样训练,可以做哪些优化)。我们就会发现,有很多研究者,在...

刘小米_思聪
17分钟前
0
0
阿里巴巴智能监控新场景的探索

摘要: 智能监控是智能运维的子领域,详细分析。 作者简介 王肇刚 阿里巴巴全球运行指挥中心高级技术专家 智能监控是智能运维的子领域,我们说的监控,探讨的更多是在监控策略,因为可能从数...

阿里云官方博客
20分钟前
1
0
【双十二】12 月 12 日 12 点 12 分限量抢福利,云计算不剁手!

活动详情 1.首充豪礼 双十二当日,新用户首充 200 元送 200 元代金券!仅限前 88 名!先到先得!拼手速!(新用户指 12 月 12 日前已完成注册但从未充值过的用户)
 2.超值返券 双十二当日,...

七牛云
45分钟前
3
0
Calculate Linux 发布 18 LXQt是基于Gentoo的发行版

导读 Calculate Linux 是一个基于 Gentoo 并与 Gentoo 完全兼容的滚动更新发行版家族,专为企业环境下的快速部署而优化。其提供多个不同的分支版本,分别适用于桌面、服务器等应用场景。该项...

问题终结者
47分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部