<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>View on 代码学习站</title>
        <link>https://a6233.com/tags/view/</link>
        <description>Recent content in View on 代码学习站</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Tue, 01 Apr 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://a6233.com/tags/view/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>requestLayout() 和 invalidate() 作用</title>
        <link>https://a6233.com/posts/requestlayout-%E5%92%8C-invalidate-%E4%BD%9C%E7%94%A8/</link>
        <pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate>
        
        <guid>https://a6233.com/posts/requestlayout-%E5%92%8C-invalidate-%E4%BD%9C%E7%94%A8/</guid>
        <description>&lt;p&gt;&lt;code&gt;requestLayout()&lt;/code&gt; 和 &lt;code&gt;invalidate()&lt;/code&gt; 是 Android 中 View 类的两个重要方法，用于不同的视图更新场景。让我解释它们的作用和区别：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;requestLayout() 方法&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;作用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;请求重新测量和布局整个视图树。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;触发视图的 onMeasure() 和 onLayout() 方法。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用于视图的大小或位置发生变化时。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;调用时机：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;当视图的尺寸需要改变时。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当视图的位置需要改变时。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当视图的子视图发生增删或其布局参数变化时。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例子：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;button.setVisibility(View.GONE);
parentLayout.requestLayout();
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;invalidate() 方法&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;作用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;请求重绘视图。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;触发视图的 onDraw() 方法。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用于视图的内容或外观需要更新，但尺寸和位置不变时。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;调用时机：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;当视图的颜色、文本内容等发生变化时。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当需要重新绘制自定义视图的内容时。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;动画更新时。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例子：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;textView.setTextColor(Color.RED);
textView.invalidate();
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;主要区别：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;影响范围：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;requestLayout(): 可能影响整个视图层次结构的布局。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;invalidate(): 通常只影响调用它的视图及其子视图。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;性能影响：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;requestLayout(): 开销较大，因为它可能导致整个视图树的重新测量和布局。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;invalidate(): 开销相对较小，通常只涉及重绘。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;触发的回调：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;requestLayout(): 触发 onMeasure() 和 onLayout()，可能还会触发 onDraw()。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;invalidate(): 主要触发 onDraw()。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用场景：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;requestLayout(): 用于影响视图结构或尺寸的变化。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;invalidate(): 用于视图内容或外观的更新。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;线程安全：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;requestLayout(): 可以在非 UI 线程调用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;invalidate(): 只能在 UI 线程调用。（非 UI 线程应使用 postInvalidate()）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实际使用示例：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;public class CustomView extends View {
    private int mColor;

    public void setColor(int color) {
        mColor = color;
        invalidate(); // 只需要重绘
    }

    public void setNewSize(int width, int height) {
        getLayoutParams().width = width;
        getLayoutParams().height = height;
        requestLayout(); // 需要重新测量和布局
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 使用 mColor 绘制
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在这个例子中，改变颜色只需要 invalidate()，而改变尺寸则需要 requestLayout()。&lt;/p&gt;
&lt;p&gt;理解这两个方法的区别和适用场景对于优化 Android 应用的性能和创建响应式 UI 非常重要。如果你想了解更多关于如何在复杂场景中使用这些方法，或者需要更多的代码示例，我可以为你提供更详细的信息。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
