iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android View刷新机制实例分析
  • 736
分享到

Android View刷新机制实例分析

viewAndroid 2022-06-06 08:06:44 736人浏览 薄情痞子
摘要

本文实例讲述了Android View刷新机制。分享给大家供大家参考,具体如下: 一、总体说明 在Android的布局体系中,父View负责刷新、布局显示子View;而当子Vi

本文实例讲述了Android View刷新机制。分享给大家供大家参考,具体如下:

一、总体说明

在Android的布局体系中,父View负责刷新、布局显示子View;而当子View需要刷新时,则是通知父View来完成。

二、代码分析

1).ViewGroup的addView方法,理解参数的意义和传递

invalidate调用父类View的方法
addViewInner方法主要做的事情是

view的dispatchAttachedToWindow(AttachInfo info, int visibility)方法

1).View的invalidate方法,这是一个从下第向上回溯的过程,每一层的父View都将自己的显示区域与传入的刷新

Rect做交集。


void invalidate(boolean invalidateCache) {
    if (ViewDebug.TRACE_HIERARCHY) {
      ViewDebug.trace(this, ViewDebug.HierarchyTraceType.INVALIDATE);
    }
    if (skipInvalidate()) {
      return;
    }
    if ((mPrivateFlags & (DRAWN | HAS_BOUNDS)) == (DRAWN | HAS_BOUNDS) ||
        (invalidateCache && (mPrivateFlags & DRAWING_CACHE_VALID) == DRAWING_CACHE_VALID) ||
        (mPrivateFlags & INVALIDATED) != INVALIDATED || isOpaque() != mLastIsOpaque) {
      mLastIsOpaque = isOpaque();
      mPrivateFlags &= ~DRAWN;
      mPrivateFlags |= DIRTY;
      if (invalidateCache) {
        mPrivateFlags |= INVALIDATED;
        mPrivateFlags &= ~DRAWING_CACHE_VALID;
      }
      final AttachInfo ai = mAttachInfo;
      final ViewParent p = mParent;
      //noinspection PointlessBooleanExpression,ConstantConditions
      if (!HardwareRenderer.RENDER_DIRTY_REGIONS) {
        if (p != null && ai != null && ai.mHardwareAccelerated) {
          // fast-track for GL-enabled applications; just invalidate the whole hierarchy
          // with a null dirty rect, which tells the ViewAncestor to redraw everything
          p.invalidateChild(this, null);
          return;
        }
      }
      if (p != null && ai != null) {
        final Rect r = ai.mTmpInvalRect;
        r.set(0, 0, mRight - mLeft, mBottom - mTop);
        // Don't call invalidate -- we don't want to internally scroll
        // our own bounds
        p.invalidateChild(this, r);//调用子类的方法完成
      }
    }
  }

2)ViewGrop的invalidateChild方法


public final void invalidateChild(View child, final Rect dirty) {
  ViewParent parent = this;
  final AttachInfo attachInfo = mAttachInfo;
  if (attachInfo != null) {
    final int[] location = attachInfo.mInvalidateChildLocation;
    // 需要刷新的子View的位置 
    location[CHILD_LEFT_INDEX] = child.mLeft;
    location[CHILD_TOP_INDEX] = child.mTop;
    // If the child is drawing an animation, we want to copy this flag onto
    // ourselves and the parent to make sure the invalidate request Goes through
    final boolean drawAnimation = (child.mPrivateFlags & DRAW_ANIMATION) == DRAW_ANIMATION;
    // Check whether the child that requests the invalidate is fully opaque
    final boolean isOpaque = child.isOpaque() && !drawAnimation && child.getAnimation() != null;
    // Mark the child as dirty, using the appropriate flag
    // Make sure we do not set both flags at the same time
    final int opaqueFlag = isOpaque ? DIRTY_OPAQUE : DIRTY;
    do {
      View view = null;
      if (parent instanceof View) {
        view = (View) parent;
      }
      if (drawAnimation) {
        if (view != null) {
            view.mPrivateFlags |= DRAW_ANIMATION;
        } else if (parent instanceof ViewRoot) {
            ((ViewRoot) parent).mIsAnimating = true;
        }
      }
        // If the parent is dirty opaque or not dirty, mark it dirty with the opaque
        // flag coming from the child that initiated the invalidate
      if (view != null && (view.mPrivateFlags & DIRTY_MASK) != DIRTY) {
        view.mPrivateFlags = (view.mPrivateFlags & ~DIRTY_MASK) | opaqueFlag;
      }
      parent = parent.invalidateChildInParent(location, dirty);
    } while (parent != null);
  }
}
public ViewParent invalidateChildInParent(final int[] location, final Rect dirty) {
  if ((mPrivateFlags & DRAWN) == DRAWN) {
    if ((mGroupFlags & (FLAG_OPTIMIZE_INVALIDATE | FLAG_ANIMATION_DONE)) !=
            FLAG_OPTIMIZE_INVALIDATE) {
      // 根据父View的位置,偏移刷新区域 
      dirty.offset(location[CHILD_LEFT_INDEX] - mScrollX, location[CHILD_TOP_INDEX] - mScrollY);
      final int left = mLeft;
      final int top = mTop;
      //计算实际可刷新区域 
      if (dirty.intersect(0, 0, mRight - left, mBottom - top) ||
            (mPrivateFlags & DRAW_ANIMATION) == DRAW_ANIMATION) {
        mPrivateFlags &= ~DRAWING_CACHE_VALID;
        location[CHILD_LEFT_INDEX] = left;
        location[CHILD_TOP_INDEX] = top;
        return mParent;
      }
    } else {
      mPrivateFlags &= ~DRAWN & ~DRAWING_CACHE_VALID;
      location[CHILD_LEFT_INDEX] = mLeft;
      location[CHILD_TOP_INDEX] = mTop;
      dirty.set(0, 0, mRight - location[CHILD_LEFT_INDEX],
            mBottom - location[CHILD_TOP_INDEX]);
        return mParent;
      }
    }
    return null;
}

这个向上回溯的过程直到ViewRoot那里结束,由ViewRoot对这个最终的刷新区域做刷新

ViewRoot.java


public void invalidateChild(View child, Rect dirty) {
}

由ViewRoot对象的perfORMTraversals()方法调用draw()方法发起绘制该View树,值得注意的是每次发起绘图时,并不会重新绘制每个View树的视图,而只会重新绘制那些“需要重绘”的视图,View类内部变量包含了一个标志位DRAWN,当该视图需要重绘时,就会为该View添加该标志位。

调用流程

mView.draw()开始绘制,draw()方法实现的功能如下:

1 、绘制该View的背景
2 、为显示渐变框做一些准备操作(见5,大多数情况下,不需要改渐变框)
3、调用onDraw()方法绘制视图本身   (每个View都需要重载该方法,ViewGroup不需要实现该方法)
4、调用dispatchDraw ()方法绘制子视图(如果该View类型不为ViewGroup,即不包含子视图,不需要重载该
方法)值得说明的是,ViewGroup类已经为我们重写了dispatchDraw ()的功能实现,应用程序一般不需要重写该
方法,但可以重载父类函数实现具体的功能。

4.1 dispatchDraw()方法内部会遍历每个子视图,调用drawChild()去重新回调每个子视图的draw()方法(注意,这个 地方“需要重绘”的视图才会调用draw()方法)。值得说明的是,ViewGroup类已经为我们重写了dispatch

Draw()的功能实现,应用程序一般不需要重写该方法,但可以重载父类函数实现具体的功能。

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

您可能感兴趣的文章:Android实现上拉加载更多以及下拉刷新功能(ListView)Android开发之ListView实现Item局部刷新Android中ListView下拉刷新的实现方法实例分析Android开发之ListView列表刷新和加载更多实现方法android中ListView数据刷新时的同步方法android开发教程之实现listview下拉刷新和上拉刷新效果android中ListView多次刷新重复执行getView的解决方法Android开发笔记之:ListView刷新顺序的问题详解android下拉刷新ListView的介绍和实现代码Android下拉刷新ListView——RTPullListView(demo)


--结束END--

本文标题: Android View刷新机制实例分析

本文链接: https://www.lsjlt.com/news/25625.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringCloud @RefreshScope刷新机制源码分析
    今天小编给大家分享一下SpringCloud @RefreshScope刷新机制源码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我...
    99+
    2023-07-05
  • Android View的事件体系实例分析
    这篇“Android View的事件体系实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android&nb...
    99+
    2023-06-29
  • vue中axios拦截器token刷新机制的示例分析
    这篇文章主要为大家展示了“vue中axios拦截器token刷新机制的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue中axios拦截器token刷...
    99+
    2024-04-02
  • SpringCloud @RefreshScope刷新机制浅析
    目录一、前言二、@Scope三、RefreshScope 的实现原理四、总结一、前言 用过Spring Cloud的同学都知道在使用动态配置刷新的我们要配置一个@RefreshSco...
    99+
    2023-03-12
    SpringCloud @RefreshScope SpringCloud刷新机制
  • Vue-input框checkbox强制刷新的示例分析
    小编给大家分享一下Vue-input框checkbox强制刷新的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  在引用...
    99+
    2024-04-02
  • Android事件分发机制示例分析
    Android事件类型 public boolean onTouchEvent(MotionEvent event) { switch (event.getActio...
    99+
    2024-04-02
  • ajax实现无刷新分页的示例分析
    这篇文章给大家分享的是有关ajax实现无刷新分页的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Ajax 无刷新页面的好处:提供良好的客户体验,通过 Ajax 在后台从数据库中取得数据并展示,取缔了等待加...
    99+
    2023-06-08
  • Android中自定义view中事件分发机制与处理的示例分析
    这篇文章将为大家详细讲解有关Android中自定义view中事件分发机制与处理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。题引事件只有一个,多个人想要处理,处理的对象不是我们想给的对象就是事件...
    99+
    2023-06-25
  • Android的VSYNC机制和UI刷新流程示例详解
    目录前言一、 Vsync信号详解1、屏幕刷新相关知识点2、VSYNC机制二、UI刷新原理流程1、VSYNC流程示意2、view的invalidate3、scheduleTravers...
    99+
    2022-12-09
    Android VSYNC机制UI刷新 Android VSYNC
  • Elasticsearches打分机制实例分析
    今天小编给大家分享一下Elasticsearches打分机制实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一 例子现...
    99+
    2023-06-30
  • Android 图片的三级缓存机制实例分析
    Android 图片的三级缓存机制实例分析当我们获取图片的时候,如果不加以协调好图片的缓存,就会造成大流量,费流量应用,用户体验不好,影响后期发展。为此,我特地分享Android图片的三级缓存机制之从网络中获取图片,来优化应用,具体分三步进...
    99+
    2023-05-31
    android 图片 三级缓存
  • Javascript刷新页面的示例分析
    小编给大家分享一下Javascript刷新页面的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Javascript刷新页...
    99+
    2024-04-02
  • 深入浅析Android项目中的 View事件分发机制
    本篇文章为大家展示了深入浅析Android项目中的 View事件分发机制,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。具体方法如下:public class MyButton extends But...
    99+
    2023-05-31
    view roi 目中
  • 微信小程序中scroll-view实现上拉加载与下拉刷新的示例分析
    这篇文章主要为大家展示了“微信小程序中scroll-view实现上拉加载与下拉刷新的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信小程序中scrol...
    99+
    2024-04-02
  • Android之从IO到NIO的模型机制实例分析
    这篇文章主要讲解了“Android之从IO到NIO的模型机制实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android之从IO到NIO的模型机制实例分析”吧!1 Basic IO模...
    99+
    2023-07-05
  • Vue异步更新机制和nextTick原理实例分析
    这篇文章主要介绍“Vue异步更新机制和nextTick原理实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue异步更新机制和nextTick原理实例分析”文章能帮助大家解决问题。1. 异步更...
    99+
    2023-06-27
  • Ajax异步刷新功能举例分析
    本篇内容主要讲解“Ajax异步刷新功能举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Ajax异步刷新功能举例分析”吧!在这里我们首先说一下关于$_GET请求和$_POST请求 。方法:o...
    99+
    2023-06-25
  • Java反射机制实例分析
    这篇“Java反射机制实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java反射机制实例分析”文章吧。Java反射机...
    99+
    2023-06-29
  • JS运行机制实例分析
    本篇内容主要讲解“JS运行机制实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS运行机制实例分析”吧! 1.为什么JS是单线程的 JS的单线程,与它...
    99+
    2024-04-02
  • Angular DOM中更新机制的示例分析
    这篇文章主要介绍了Angular DOM中更新机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。由模型变化触发的 DOM 更新是所有前端框架的重要功能(注:即保持 ...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作