面试总结(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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel