android scrollview 滚动时会调用onlayout么

ScrollView(RecyclerView等)为什么会自动滚动原理分析,还有阻止自动滑动的解决方案,2024Android面试心得 通过上面的分析,其实我们可以得到多种解决ScrollView会自动滚动到获取焦点的子view的方法,比如自定义重写Scrollview的requestChildFocus方法,直接返回return,就能中断Scrollview的自动滑动,本质上都是中断了ScrollView重写的方法requestChildFocus的进行,或者是让Scrollview中铺满ScrollView的子view获取到焦点,这样虽然滑动,但是滑动的距离只是为0罢了,相当于没有滑动罢了。 阅读详情

调用onlayout 的条件是   changed == true。 setFrame 返回 true 。也就是说,必须有, top,left,right,bottom 的值的变化。

    public void layout(int l, int t, int r, int b) {
        int oldL = mLeft;
        int oldT = mTop;
        int oldB = mBottom;
        int oldR = mRight;
        boolean changed = setFrame(l, t, r, b);
        if (changed || (mPrivateFlags & LAYOUT_REQUIRED) == LAYOUT_REQUIRED) {
            onLayout(changed, l, t, r, b);
            mPrivateFlags &= ~LAYOUT_REQUIRED;

            ListenerInfo li = mListenerInfo;
            if (li != null && li.mOnLayoutChangeListeners != null) {
                ArrayList<OnLayoutChangeListener> listenersCopy =
                        (ArrayList<OnLayoutChangeListener>)li.mOnLayoutChangeListeners.clone();
                int numListeners = listenersCopy.size();
                for (int i = 0; i < numListeners; ++i) {
                    listenersCopy.get(i).onLayoutChange(this, l, t, r, b, oldL, oldT, oldR, oldB);
                }
            }
        }
        mPrivateFlags &= ~FORCE_LAYOUT;
    }



    protected boolean setFrame(int left, int top, int right, int bottom) {
        boolean changed = false;

        if (DBG) {
            Log.d("View", this + " View.setFrame(" + left + "," + top + ","
                    + right + "," + bottom + ")");
        }

        if (mLeft != left || mRight != right || mTop != top || mBottom != bottom) {
            changed = true;

            // Remember our drawn bit
            int drawn = mPrivateFlags & DRAWN;

            int oldWidth = mRight - mLeft;
            int oldHeight = mBottom - mTop;
            int newWidth = right - left;
            int newHeight = bottom - top;
            boolean sizeChanged = (newWidth != oldWidth) || (newHeight != oldHeight);

            // Invalidate our old position
            invalidate(sizeChanged);

            mLeft = left;
            mTop = top;
            mRight = right;
            mBottom = bottom;
            if (mDisplayList != null) {
                mDisplayList.setLeftTopRightBottom(mLeft, mTop, mRight, mBottom);
            }

            mPrivateFlags |= HAS_BOUNDS;


            if (sizeChanged) {
                if ((mPrivateFlags & PIVOT_EXPLICITLY_SET) == 0) {
                    // A change in dimension means an auto-centered pivot point changes, too
                    if (mTransformationInfo != null) {
                        mTransformationInfo.mMatrixDirty = true;
                    }
                }
                onSizeChanged(newWidth, newHeight, oldWidth, oldHeight);
            }

            if ((mViewFlags & VISIBILITY_MASK) == VISIBLE) {
                // If we are visible, force the DRAWN bit to on so that
                // this invalidate will go through (at least to our parent).
                // This is because someone may have invalidated this view
                // before this call to setFrame came in, thereby clearing
                // the DRAWN bit.
                mPrivateFlags |= DRAWN;
                invalidate(sizeChanged);
                // parent display list may need to be recreated based on a change in the bounds
                // of any child
                invalidateParentCaches();
            }

            // Reset drawn bit to original value (invalidate turns it off)
            mPrivateFlags |= drawn;

            mBackgroundSizeChanged = true;
        }
        return changed;
    }

 

而scrollview 滚动时,调用的scrollTo 方法 只改变了scrollX, scrollY 的值。然后重绘,所以不会调用onlayout方法


    public void scrollTo(int x, int y) {
        if (mScrollX != x || mScrollY != y) {
            int oldX = mScrollX;
            int oldY = mScrollY;
            mScrollX = x;
            mScrollY = y;
            invalidateParentCaches();
            onScrollChanged(mScrollX, mScrollY, oldX, oldY);
            if (!awakenScrollBars()) {
                postInvalidateOnAnimation();
            }
        }
    }


Android ScrollView源码简析 结合前文所有疑问和源码解析,我们可以用一句话总结ScrollViewScrollView 自身拒绝 UNSPECIFIED 模式,确保自身有明确高度;同时给childView设置 UNSPECIFIED 模式,让childView测量出真实内容高度;onLayout 完整摆放childView,scrollTo 移动画布实现滚动,最终呈现“超出部分可滚动”的效果。其中,模式的核心作用,是“解除对childView高度的限制”,让childView能突破ScrollView。 阅读详情

相关推荐

解决 TensorFlow 和 Keras 的 Python 版本兼容问题:详细技术指南

本文提供了TensorFlow和Keras与Python版本不兼容问题的完整解决方案。通过版本对照表指出不同TensorFlow版本对应的Python支持范围,强调2.13.x仅支持Python 3.9-3.11,且不兼容Python 3.12+。给出最佳实践建议:使用虚拟环境管理项目依赖,推荐venv或conda创建独立环境;指导正确安装TensorFlow和Keras版本,建议优先使用tf.keras避免冲突;针对常见报错如DLL加载失败、模块导入错误等提供具体解决方法。最后给出一个在兼容环境中运行的M

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1663

onmeasure被调用了但是onlayout没有被调用

这个是做systemui的时候的一个bug,就是发现打开通知中心后,删除一个通知之后再也接收不到通知了,当然通知删除有个动画。通知列表放在一个scrollView里面。调试发现onmeasure被调用了但是onlayout没有被调用。跟踪layout的过程终于发现是LayoutTrasition的问题导致scrollview的onlayout调用ViewGroupe的layout时出现了问题。

luozirong的专栏 1984

Ubuntu20.04运行Vins-fusion

因已安装ROS noetic,eigen,opencv及ceres等库,这部分环境配置就不细讲,直接下载VINS-FUSION的代码库 下载编译 cd ~/vins-fusion/src git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git cd ../ catkin_make source ~/catkin_ws/devel/setup.bash 编译时会发现一堆错误,别急,无非就是环境冲突问题,一个个解决 1)首先,ROS

xiaojinger_123的博客 1万+

android:layout_margin真实含义 及 自定义复合控件 layout()执行无效的问题解决

一、关于layout_margin 搞Android时间也不短了,对layout_margin也不陌生了,可最近遇到一个问题让我发现,对它的认识还不够深入全面。大量网络资料上都说,layout_margin指view距离父view的距离。这个说法不够严谨,正确的说法是,距离view的相对view的距离才更准确。 在Linearlayout下,可以认为是距离父view的距离。但在RelativeLa

yanzi1225627的专栏 2万+

rag综述——RAG技术发展流程、最新技术挑战与系统级优化

RAG技术发展综述:本文系统梳理了检索增强生成(RAG)技术的演进历程,从2017年开放域问答中的早期探索,到2020年正式提出RAG架构并与大模型深度融合,再到2025年向系统化、可信化和智能体化发展。当前RAG面临检索可靠性、系统效率和生成可信度三大核心挑战,解决方案包括领域自适应训练、强化语义编码、迭代检索策略等优化方向。未来RAG将向GraphRAG、SafeRAG等方向发展,从单纯性能优化转向构建可控、可审计的语言系统框架,成为高可靠大模型应用的基础设施。

lovehu6686的博客 1240

硬件工程师学习-硬件的单元测试(UT)(1)电源与时钟的测试

我们在设计的时候,通过控制电源的上电使能管脚或者通过MOSFET、或者专用的电源上电控制芯片,控制不同电源的上电时序,以确保每个芯片的电源上电时序是满足芯片的要求的。我们在测试的时候,需要对相关的要求一一测试,以确认每个上电时序满足要求的。在维基百科中,相位噪声的定义是“时域不稳定性(抖动)导致波形在相位上发生快速、短期、随机的波动,这种波动在频域中的表现即为相位噪声”。单元测试,一般是指基于开发人员自行开展的功能测试及各个功能单元的单元测试,是硬件信号级的测试,分为基本测试和信号完整性测试。

qq_43416206的博客 4033

自定义view中onMeasure、onLayout、onDraw、onFinishInflate、onSizeChanged方法调用时机

一般自定义view或viewGroup基本上都会去实现onMeasure、onLayout、onDraw方法,还有另外两个方法是onFinishInflate和onSizeChanged。 onFinishInflate方法只有在布局文件中加载view实例会回调,如果直接new一个view的话是不会回调的。 比如一个ViewGroup,只有它和它的子view完全被加载实例化了之后才回去

网鱼的栈 6981

Verilog HDL 100道面试题及参考答案

在 Verilog HDL 中,参数(parameter)和宏定义(define)都可用于定义常量,但它们存在诸多不同之处。参数(parameter)是模块内部的常量定义,具有局部性。它在模块内部起作用,不同模块可以有同名的参数,且值可以不同。参数通常用于定义模块的一些配置信息,例如数据位宽、延迟时间等。参数的定义和使用是在模块的作用域内进行的,通过参数传递可以方便地对模块进行配置。endmodule在上述代码中,WIDTH是一个参数,用于定义加法器的位宽。通过改变WIDTH。

大模型大数据攻城狮的专栏 1732

Android中自定义LinearLayout中layout方法不起作用的原因

最近做完一个自定义ViewGroup 实现流式布局的效果,效果如下 简单来说就是继承ViewGroup,onMeasure onLayout 各种测试、布局,然后在xml引入该自定义View使用即可 重点来了,然后自己实现一个自定义LinearLayout的时候,还是按部就班 onMeasure onLayout ....省略计算过程 然后调用View.Layout(l,t,r,b); 发现设置的距离完全不起作用,效果如下 位置随意设置,完全没用!! 一番折腾,想起来,Line

hang593092072的博客 1724

AI漫剧全套万能提示词合集

今天给大家整理一套已经跑通爆款漫剧的万能提示词库!覆盖:豆包剧本人设词 + 分镜生成词 + 即梦绘图词 + 动态优化词 + 防翻车固定词直接复制粘贴,新手也能做出稳定、高清、统一、有质感的AI漫剧!你是资深短视频漫剧编剧,擅长制作60秒竖屏爆款AI漫剧,请为我创作一集完整漫剧内容。要求:开头3秒高能抓眼,中段有冲突转折,结尾留强悬念钩子,节奏紧凑、适合短视频流量。首先生成固定统一人物人设:包含脸型、五官、发色、发型、穿搭、身材、气质、画风、光影细节,要求足够精细,保证全程角色不变脸。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 1875

人工智能 (Artificial Intelligence, AI) 原理与代码实例讲解

人工智能 (AI) 机器学习 (Machine Learning) 深度学习 (Deep Learning) 算法 模型 代码实例 应用场景 1. 背景介绍 人工智能 (Artificial Intelligence, AI) 作为一项前沿科技,近年来发展迅速,已渗透到生活的方方面面

AI架构师小马 1226

android onLayout死循环

有时候,开发代码的时候,真的是因为你的无知,就导致了程序性能低下。 比如: @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r,...

weixin_30332705的博客 402

31、双相不锈钢直齿轮加工与性能研究及人工神经网络在焊接中的应用

本文研究了双相不锈钢直齿轮在不同加工方法(WEDM与滚齿加工)下的磨损行为,分析了表面粗糙度、齿厚变化、磨损率及润滑性能随转速的变化规律,并对比了两种工艺的优劣。同时,探讨了人工神经网络(ANN)在AA7050铝合金搅拌摩擦焊中的应用,通过建立工艺参数与焊接质量之间的预测模型,实现了对焊缝硬度和峰值温度的准确预测。研究为高性能齿轮制造和铝合金焊接提供了理论支持和技术参考,并提出了未来在润滑优化、加工工艺改进及智能控制方面的研究方向。

ggg99的专栏 150

ScrollView(RecyclerView等)为什么会自动滚动原理分析

3.那么ScrollView为什么会滑到获取焦点的子view的位置了? 答:通过上面的分析,我们可以看到当Scrollview中包含有焦点的view的时候,最终会执行view树的重绘制,所以会调用view的onLayout方法,我们看下ScrollView的onLayout方法 android.view.ScrollView{ @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLa

m0_66264910的博客 864

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ViewGroup的onLayout、layout方法

onLayout、layout方法简介 onLayout方法是ViewGroup中子View的布局方法,用于放置子View的位置。放置子View很简单,只需在重写onLayout方法,然后获取子View的实例,调用子View的layout方法实现布局。在实际开发中,一般要配合onMeasure测量方法一起使用。 onLayout方法: @Override protected abst

丁丁的专栏 3576

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android 使用Scroller自动滚动第一种实现

源码下载 , 效果图如下: 1. 自定义视图继承自ViewGroup,覆写onMeasure,onLayout,之前文章介绍过覆写这两个方法。 2. 提供两个方法供两个button使用,向左向右移动。调用startScroll (int startX, int startY, int dx, int dy)方法, 以提供的起始点和将要滑动的距离开始滚动。滚动会使用缺省值250m

Android 6579

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

ScrollView实现原理分析

ScrollView继承自,这意味着它本身是一个布局容器,可以包含一个子视图,并且提供了滚动功能。245 // 滚动状态9// 最大滚动持续时间1112 // 内部状态1415 // 滚动监听器1718 // 构造函数22 }2327 }2832 }3335 // 初始化操作// 填充整个视口// 可聚焦// 子视图优先获得焦点39 }4041 // 设置滚动监听器44 }4546 // 获取当前滚动位置49 }50。

VitorLiu的博客 869

一个关于View/ViewGroup onMeasure() onLayout()被调用了但是onDraw()没有被调用的问题分析

好,问题的背景大家应该很熟悉,Android 的ViewGroup中可以通过addview()的方式加入View或者viewGroup,然后通常一个view要正常显示在屏幕上它的onMeasure(), onLayout()和onDraw至少要被调用一次。 现在我遇到的一个需求是SystemUI,显示状态栏的列表,当列表比较小时显示全部,当列表比较大时显示一定的高度,其他的通过滚动的方式

luozirong的专栏 2542

ScrollView(RecyclerView等)为什么会自动滚动原理分析,还有阻止自动滑动的解决方案...

引言,有一天我在调试一个界面,xml布局里面包含Scroll View,里面嵌套了recyclerView的时候,界面一进去,就自动滚动到了recyclerView的那部分,百思不得其解,上网查了好多资料,大部分只是提到了解决的办法,但是对于为什么会这样,都没有一个很好的解释,本着对技术的负责的态度,花费了一点时间将前后理顺了下 1.首先在包含ScrollView的xml布局中,我们在一...

R18813293662的博客 134

fragment中 ScrollView 同时嵌套viewpager banner和 listview, scrollview 滑动异常·

fragment中 ScrollView                      同时嵌套viewpager banner和                  listview, 如图所示 在fragment首次加载或 onHiddenChanged事件发生后 scrollview都会滑动到listview的顶部 这破scrollview ,上一个项目也遇到同样的问题 忘了怎么解...

cumtqt的博客 833

android之自定义viewGroup仿scrollView详解

相信学了安卓的朋友都知道自定义viewGroup离不开重写onmeasure()和onLayout(),开始讲解代码之前,先来看看与这两个方法相关知识:    一、onMeasure() :这是测量自身的宽高和子view的宽高方法,测量涉及的知识点除了宽高之外,还有三种模式           (1) 三种模式如下:                1、MeasureSpec.EXACTLY:

小钟的专栏 4645

ScrollView(RecyclerView等)自动滚动原理分析,还有阻止自动滑动的解决方案

原文链接:http://www.jcodecraeer.com/plus/view.php?aid=9270 引言,有一天我在调试一个界面,xml布局里面包含Scroll View,里面嵌套了recyclerView的时候,界面一进去,就自动滚动到了recyclerView的那部分,百思不得...

chuangshenxian4161的博客 242

Android 源码解析 - ScrollView

ScrollView 可以在垂直方向做滑动显示内容,并且ScrollView中只能添加一个子View,下面对源代码进行分析。 源码解析 ScrollView 继承关系 onMeasure方法 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.on

小北的博客 681

安卓ScrollView中嵌套 GridView 导致 ScrollView默认不停留在顶部的解决方案

ScrollView中嵌套 GridView 导致 ScrollView默认不停留在顶部的解决方案和分析发生情况大概是我在ScrollView底部放了个GridView 来实现一个类似9宫格效果的展示.Grid固定为2排,每排3个.固定为6个…所以没有性能问题,不需要重用,所以直接用GridView了..只是为了方便和数据对应处理.然后出现的状况是,当我获取完数据并调用notifyDataSetCh

forLove 810

ScrollView嵌套RecyclerView:进入界面ScrollView自动滑动

背景:ScrollView嵌套PreferenceFragment。我使用的版本Preference的树的支撑是通过RecyclerView。 原因:在Activity的setContentView方法中,解析了Fragment,并调用了PreferenceFragmentCompat的onCreateView方法,方法后面post了一个Runnable。 通过调用父View的f...

u014749572的博客 1156

Android 弹性ScrollView

Android弹性ScrollView,类似于下拉刷新时的View延时拖动,这个效果我们在app中很常见,目的是使控件在下拉或者上滑时看似流畅不再生硬,使我们的界面更加的美观。

xy_liwp的博客 5189
上一篇: android 修改包名
下一篇: 如何获取listview的内容高度
javalive09
博客等级 码龄16年 43粉丝 281原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值