文档章节

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

SuShine
 SuShine
发布于 2016/07/23 11:17
字数 599
阅读 319
收藏 1
点赞 0
评论 0

自己在自定义一个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
粉丝 119
博文 452
码字总数 126400
作品 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
图解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()

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

微笑的江豚
2016/08/05
4
0
Android实现滑动的几种方法

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

addcn
2016/06/21
14
0
Android getTop, getRight, getLeft, getBottom

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

whitemine
2016/08/02
50
0
Android 中实现 ScrollView 的滚动事件监听

最近在自己实现一个类似 Pinterest 瀑布流展示效果的组件,GitHub 上其实有类似项目,比如 PinterestLikeAdapterView 、 PinterestListView ,但都或多或少有些不足(详见 这篇文章 的分析)...

丁佳辉
2016/07/20
63
0
OA系统五彩种蓝色版现jin模式稳定无错 运营中版本Android中实现上下左右都可滑动的Scrol

OA系统五彩种蓝色版现jin模式稳定无错 下载地址 QQ 2952777280 import java.util.List; import android.widget.FrameLayout; import android.content.Context; import android.graphics.Rect......

vQ2952777280
07/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
1
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
0
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
0
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
0
0
Java工具类—随机数

Java中常用的生成随机数有Math.random()方法及java.util.Random类.但他们生成的随机数都是伪随机的. Math.radom()方法 在jdk1.8的Math类中可以看到,Math.random()方法实际上就是调用Random类...

PrivateO2
今天
1
0
关于java内存模型、并发编程的好文

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

DannyCoder
昨天
0
0
dubbo @Reference retries 重试次数 一个坑

在代码一中设置 成retries=0,也就是调用超时不用重试,结果DEBUG的时候总是重试,不是0吗,0就不用重试啊。为什么还是调用了多次呢? 结果在网上看到 这篇文章才明白 https://www.cnblogs....

奋斗的小牛
昨天
2
0
数据结构与算法3

要抓紧喽~~~~~~~放羊的孩纸回来喽 LowArray类和LowArrayApp类 程序将一个普通的Java数组封装在LowArray类中。类中的数组隐藏了起来,它是私有的,所以只有类自己的方法才能访问他。 LowArray...

沉迷于编程的小菜菜
昨天
0
0
spring boot应用测试框架介绍

一、spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数...

yangjianzhou
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部