面试总结(4):top、left、right、bottom 和 translationX、translationY 和 scrollX,scrollY的区别

本文主要是介绍面试总结(4):top、left、right、bottom 和 translationX、translationY 和 scrollX,scrollY的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#前言#

这是前几天面试的时候遇到的一个问题,之前没有专门去研究这三个概念的区别,所以就凭印象回答了这道题,回来就实际研究一下,发现自己回答还算可以吧。

#正文#

top、left、right、bottom

经过我的亲身测试,总结如下:

top、left、right、bottom 都是以父View作为参考物的返回的坐标值。
top:距离父容器的y距离。
left:距离父容器的x距离。
right:left + view本身的宽度。
bottom:top + view本身的高度。

padding值对于 top、left、right、bottom 无影响(因为宽度没有发生改变)
margin值对于top、left、right、bottom 有影响(不影响宽高,但是margin会改变left和top,所以就直接影响了right和bottom)

top的最小值是 -viewHeight
left的最小是-viewWidth

translationX、translationY

这个其实就非常好理解了,这两个方法使用的也是比较多,就是相对于自身的位置进行偏移的值。

translationX:相对于最初位置的x方向的偏移值
translationY:相对于最初位置的y方向的偏移值。

仅仅是显示的位置出现了偏移,但是view的实际位置并没有发生改变,所以这两个值对于top、left、right、bottom是没有影响的。

scrollX,scrollY

scrollX:表示view在x方向的滚动的距离。
scrollY:表示view在y方向的滚动的距离。

这个理解起来也非常简单,我们也经常用来检查是否滚动到顶部、底部或者其他的操作,但是他俩对于top、left、right、bottom是否有影响呢?

以android本身自带的具有滚动特性的View来做个试验:

1、scrollView

ScrollView是一个特殊的View,他的滚动状态对于第一个Child是无影响的,但是内容child内部的View是有影响的,所以如果我们想要判断ScrollView是否滑动到顶部,可以判断Child最顶部的view的top是否为0。

2、ListView

listView  = (ListView) findViewById(R.id.listView);listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,new String[]{"111","111","111","111","111","111","111","111","111","111","111","111","111","111","111","111","111","111","111","111","111","111","111","111","111"}));final View header = getLayoutInflater().inflate(R.layout.header, listView, false);listView.addHeaderView(header);listView.setOnScrollListener(new AbsListView.OnScrollListener() {@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {Log.e("lzp", "top:" + header.getTop()+ " left:" + header.getLeft()+ " right:" + header.getRight()+ " bottom:" + header.getBottom());}});

代码里,我们在listView滚动的时候打印header的四个值:

这里写图片描述

从结果上看,listview对于子View的top、left、right、bottom是有影响。

那为什么同样是滚动,却得到了两个完全不一样的结果呢?

其实这个问题并不难解释,这和两个控件的内部特性有关系:

1、top、left、right、bottom的值,是在view的onLayout的时候确定。

2、scrollView只在绘制的时候onLayout,在滚动的时候不会再次出发onLayout,所以对于子View的top、left、right、bottom是没有影响的、

3、listView自身有回收机制,所以在滚动的时候需要时刻去检测item是否已经滚动出了屏幕,这样就需要重新测量子view的位置,所以就直接影响了item的top、left、right、bottom。

#总结#

这几个概念的解释和相互之间的关系我们都已经弄清楚了,top、left、right、bottom依赖于界面的onLayout,只要会触发onLayout就可能会影响到他们的值。

translationX、translationY、scrollX、scrollY都是比较独立的概念,理解起来就简单一点。

下一篇接着写面试总结:Fragment的懒加载。

这篇关于面试总结(4):top、left、right、bottom 和 translationX、translationY 和 scrollX,scrollY的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1030589

相关文章

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Linux中的more 和 less区别对比分析

《Linux中的more和less区别对比分析》在Linux/Unix系统中,more和less都是用于分页查看文本文件的命令,但less是more的增强版,功能更强大,:本文主要介绍Linu... 目录1. 基础功能对比2. 常用操作对比less 的操作3. 实际使用示例4. 为什么推荐 less?5.

Java 关键字transient与注解@Transient的区别用途解析

《Java关键字transient与注解@Transient的区别用途解析》在Java中,transient是一个关键字,用于声明一个字段不会被序列化,这篇文章给大家介绍了Java关键字transi... 在Java中,transient 是一个关键字,用于声明一个字段不会被序列化。当一个对象被序列化时,被

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

解读@ConfigurationProperties和@value的区别

《解读@ConfigurationProperties和@value的区别》:本文主要介绍@ConfigurationProperties和@value的区别及说明,具有很好的参考价值,希望对大家... 目录1. 功能对比2. 使用场景对比@ConfigurationProperties@Value3. 核

Spring Boot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)

《SpringBoot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)》:本文主要介绍SpringBoot拦截器Interceptor与过滤器Filter深度解析... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实

关于Mybatis和JDBC的使用及区别

《关于Mybatis和JDBC的使用及区别》:本文主要介绍关于Mybatis和JDBC的使用及区别,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、JDBC1.1、流程1.2、优缺点2、MyBATis2.1、执行流程2.2、使用2.3、实现方式1、XML配置文件

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA