View->View测量布局中requestLayout和forceLayout的区别

2024-06-10 03:28

本文主要是介绍View->View测量布局中requestLayout和forceLayout的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

XML文件

<?xml version="1.0" encoding="utf-8"?>
<com.gallery20.app.MyLinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/my_ll"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/holo_green_light"android:gravity="center"android:orientation="vertical"><com.gallery20.app.MyViewandroid:id="@+id/my_view"android:layout_width="match_parent"android:layout_height="100dp"android:background="@android:color/holo_blue_light"/><com.gallery20.app.MyButtonandroid:id="@+id/my_btn"android:layout_width="match_parent"android:layout_height="100dp"android:background="@android:color/holo_red_light"/>
</com.gallery20.app.MyLinearLayout>

Activity文件

const val TAG = "Yang"
class MainActivity : AppCompatActivity() {private var mViewGroup : LinearLayout ?= nullprivate var mButton : Button ?= nullprivate var mView : View?= nullprivate var mMainHandler = Handler(Looper.getMainLooper())override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)mViewGroup = findViewById(R.id.my_ll)mButton = findViewById(R.id.my_btn)mView = findViewById(R.id.my_view)mMainHandler.postDelayed({Log.i("yang", "<-------requestLayout------->")// 请求重新布局mView?.requestLayout()}, 2000)}
}

自定义View代码

class MyButton(context: Context, attrs: AttributeSet) : AppCompatButton(context, attrs) {override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {super.onMeasure(widthMeasureSpec, heightMeasureSpec)Log.d(TAG, "MyButton onMeasure")}override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {super.onLayout(changed, l, t, r, b)Log.d(TAG, "MyButton onLayout")}override fun onDraw(canvas: Canvas?) {super.onDraw(canvas)Log.d(TAG, "MyButton onDraw")}
}class MyLinearLayout(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {super.onMeasure(widthMeasureSpec, heightMeasureSpec)Log.d(TAG, "MyLinearLayout onMeasure")}override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {super.onLayout(changed, l, t, r, b)Log.d(TAG, "MyLinearLayout onLayout")}override fun onDraw(canvas: Canvas?) {super.onDraw(canvas)Log.d(TAG, "MyLinearLayout onDraw")}
}class MyView(context: Context, attrs: AttributeSet) : View(context, attrs) {override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {super.onMeasure(widthMeasureSpec, heightMeasureSpec)Log.d(TAG, "MyView onMeasure")}override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {super.onLayout(changed, l, t, r, b)Log.d(TAG, "MyView onLayout")}override fun onDraw(canvas: Canvas?) {super.onDraw(canvas)Log.d(TAG, "MyView onDraw")}fun updateView() {val layoutParams = layoutParamslayoutParams.height += 100}
}

requestLayout()方法

  • 不修改View的布局参数
 mMainHandler.postDelayed({Log.i("yang", "<-------requestLayout------->")// 请求重新布局mView?.requestLayout()}, 2000)// log 
2024-06-09 08:42:24.081  4438-4438  yang                    I  <-------requestLayout------->
2024-06-09 08:42:24.089  4438-4438  Yang                    D  MyView onMeasure
2024-06-09 08:42:24.089  4438-4438  Yang                    D  MyLinearLayout onMeasure
2024-06-09 08:42:24.089  4438-4438  Yang                    D  MyView onLayout
2024-06-09 08:42:24.089  4438-4438  Yang                    D  MyLinearLayout onLayout
2024-06-09 08:42:24.089  4438-4438  Yang                    D  MyLinearLayout onDraw
2024-06-09 08:42:24.089  4438-4438  Yang                    D  MyView onDraw
  • 修改View的布局参数
mMainHandler.postDelayed({Log.i("yang", "<-------requestLayout------->")mView?.updateView()// 请求重新布局mView?.requestLayout()
}, 2000)// log
2024-06-09 08:50:21.373  4943-4943  yang                 I  <-------requestLayout------->
2024-06-09 08:50:21.376  4943-4943  Yang                 D  MyView onMeasure
2024-06-09 08:50:21.376  4943-4943  Yang                 D  MyLinearLayout onMeasure
2024-06-09 08:50:21.376  4943-4943  Yang                 D  MyView onLayout
2024-06-09 08:50:21.376  4943-4943  Yang                 D  MyButton onLayout
2024-06-09 08:50:21.376  4943-4943  Yang                 D  MyLinearLayout onLayout
2024-06-09 08:50:21.377  4943-4943  Yang                 D  MyLinearLayout onDraw
2024-06-09 08:50:21.377  4943-4943  Yang                 D  MyView onDraw
2024-06-09 08:50:21.384  4943-4943  Yang                 D  MyView onDraw 

forceLayout()方法

  • 不修改View的布局参数
mMainHandler.postDelayed({Log.i("yang", "<-------forceLayout------->")// 请求重新布局mView?.forceLayout()
}, 2000)// log 
没有改变View的可见性、改变View的大小或位置,无任何Log输出
  • 修改View的布局参数
mMainHandler.postDelayed({Log.i("yang", "<-------forceLayout------->")mView?.updateView()// 请求重新布局mView?.forceLayout()
}, 2000)// log
2024-06-09 08:57:53.732  5625-5625  yang                   I  <-------forceLayout------->
2024-06-09 08:57:53.741  5625-5625  Yang                   D  MyView onMeasure
2024-06-09 08:57:53.741  5625-5625  Yang                   D  MyLinearLayout onMeasure
2024-06-09 08:57:53.741  5625-5625  Yang                   D  MyView onLayout
2024-06-09 08:57:53.741  5625-5625  Yang                   D  MyButton onLayout
2024-06-09 08:57:53.741  5625-5625  Yang                   D  MyLinearLayout onLayout
2024-06-09 08:57:53.741  5625-5625  Yang                   D  MyLinearLayout onDraw
2024-06-09 08:57:53.742  5625-5625  Yang                   D  MyView onDraw
2024-06-09 08:57:53.748  5625-5625  Yang                   D  MyView onDraw

总结

  • forceLayout()requestLayout()的主要区别在于影响范围:
    • forceLayout()将当前View标记为需要重新布局,但并不会立即触发布局过程。只有在下次draw(Canvas)方法被调用时,才会对其进行重新布局
    • requestLayout()将当前View以及其所有父View标记为需要重新布局。并不意味兄弟View也会被重新测量和布局。只有当这个View的父View的布局参数(如宽度、高度、权重等)发生变化,或者父ViewonLayout()方法被重写改变子View的布局方式时,兄弟View才可能会被重新测量和布局
    • 仅调用forceLayout()requestLayout()并不会影响到其兄弟View的测量和布局,除非父View的布局参数或布局方式发生了变化

这篇关于View->View测量布局中requestLayout和forceLayout的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1047088

相关文章

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

CSS弹性布局常用设置方式

《CSS弹性布局常用设置方式》文章总结了CSS布局与样式的常用属性和技巧,包括视口单位、弹性盒子布局、浮动元素、背景和边框样式、文本和阴影效果、溢出隐藏、定位以及背景渐变等,通过这些技巧,可以实现复杂... 一、单位元素vm 1vm 为视口的1%vh 视口高的1%vmin 参照长边vmax 参照长边re

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

java中不同版本JSONObject区别小结

《java中不同版本JSONObject区别小结》本文主要介绍了java中不同版本JSONObject区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1. FastjsON2. Jackson3. Gson4. org.json6. 总结在Jav

数据库使用之union、union all、各种join的用法区别解析

《数据库使用之union、unionall、各种join的用法区别解析》:本文主要介绍SQL中的Union和UnionAll的区别,包括去重与否以及使用时的注意事项,还详细解释了Join关键字,... 目录一、Union 和Union All1、区别:2、注意点:3、具体举例二、Join关键字的区别&php

java中的HashSet与 == 和 equals的区别示例解析

《java中的HashSet与==和equals的区别示例解析》HashSet是Java中基于哈希表实现的集合类,特点包括:元素唯一、无序和可包含null,本文给大家介绍java中的HashSe... 目录什么是HashSetHashSet 的主要特点是HashSet 的常用方法hasSet存储为啥是无序的

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

Python中@classmethod和@staticmethod的区别

《Python中@classmethod和@staticmethod的区别》本文主要介绍了Python中@classmethod和@staticmethod的区别,文中通过示例代码介绍的非常详细,对大... 目录1.@classmethod2.@staticmethod3.例子1.@classmethod

Golan中 new() 、 make() 和简短声明符的区别和使用

《Golan中new()、make()和简短声明符的区别和使用》Go语言中的new()、make()和简短声明符的区别和使用,new()用于分配内存并返回指针,make()用于初始化切片、映射... 详细介绍golang的new() 、 make() 和简短声明符的区别和使用。文章目录 `new()`

Python中json文件和jsonl文件的区别小结

《Python中json文件和jsonl文件的区别小结》本文主要介绍了JSON和JSONL两种文件格式的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 众所周知,jsON 文件是使用php JSON(JavaScripythonpt Object No