【数据以源码形式存储】【在哪里看java源码】【angular2 源码分析】android ui 源码

来源:asp课程源码

1.Android UI 架构演进:从 MVC 到 MVP、MVVM、MVI
2.android ui框架有哪些
3.【Android】UI(二)Android常用的基础布局容器
4.Android UI绘制之View绘制的工作原理
5.Android UI布局

android ui 源码

Android UI 架构演进:从 MVC 到 MVP、MVVM、MVI

       Android UI架构的演变:从MVC到MVP、MVVM和MVI

       随着Android开发的数据以源码形式存储发展,为优化代码设计,业界不断探索和实践不同的架构模式,如MVC、MVP、MVVM和MVI,它们的核心目标是“关注点分离”,以提高代码的可维护性、测试性和可读性。最初,所有UI逻辑都集中在Activity中,导致高度耦合,难以管理。

       1. MVC:Android的在哪里看java源码默认设计,将代码划分为Model、View和Controller,尽管解决了Activity代码过载问题,但Activity仍承担了View和逻辑处理的双重任务,分离不够彻底。

       2. MVP:为了解决MVC的不足,MVP将逻辑分离到Presenter,使用Contract接口定义View和Presenter的交互。但双向依赖仍是angular2 源码分析其缺点。

       3. MVVM:MVVM将Presenter变为ViewModel,使用观察者模式减少双向依赖。DataBinding等工具支持了MVVM的实现,但过度使用可能导致数据流混乱。

       4. MVI:MVI强调单数据流,通过ViewState简化View和ViewModel之间的交互。虽然更注重响应式,但过度压缩状态可能导致复杂性。

       总的程序化源码吧来说,MVP、MVVM和MVI都试图将Activity的职责分解,但每种模式都有其局限性和适用场景。MVVM和MVP本质上相似,而MVI则引入了命令式到响应式的转变。选择哪种架构,应根据项目的具体需求和团队习惯来决定,而不是盲目追求新潮。

android ui框架有哪些

       Android UI框架主要包括以下几个部分:

       1. Android原生UI框架

       Android系统自带的大淘宝客源码破解UI框架是开发的基础,它包括了一系列的UI组件,如Activity、Fragment、View、ViewGroup等。这些组件为开发者提供了构建用户界面的基础工具,例如布局、控件、菜单和对话框等。

       2. Material Design框架

       Material Design是Google推出的设计语言框架,它基于纸质触感的UI设计。在Android开发中,Material Design提供了一系列的UI组件和设计规范,旨在帮助开发者创建美观、现代化的用户界面。这一框架强调动画和过渡效果,提升用户体验。

       3. 第三方UI框架和库

       除了Android原生和Material Design,还有许多流行的第三方UI框架和库可供使用。例如,React Native可以用于构建高性能的原生界面;Flutter提供了跨平台的开发能力,可以构建美观且响应迅速的用户界面;Jetpack Compose是Android Jetpack的一部分,提供了一种更声明式的UI编程方式。这些框架和库为开发者提供了更多选择和灵活性。

       4. 自定义UI框架

       开发者也可以根据项目的需求,自行创建定制的UI框架。这通常涉及对原生组件的扩展和定制,或是直接使用开源组件库来实现特定的用户界面需求。通过自定义UI框架,可以实现更为个性化和创新的用户界面设计。

       Android UI框架涵盖了原生框架、Material Design规范、第三方库以及自定义框架等多个层面。开发者可以根据项目的需求和团队的技能选择适合的框架来构建用户界面。随着技术的不断发展,Android UI框架也在不断更新和演进,为开发者提供更多选择和可能性。

【Android】UI(二)Android常用的基础布局容器

        Android 的UI 可以分为两类,一类叫做ViewGroup容器,一类叫做View视图

        View视图:(TextView,Button,ImageView)都是常用常见的视图.

        ViewGroup容器:内部可以承载、放置、添加View视图

        线性布局就是从左到右或从上到下按顺序排列的一种布局。下面讲一讲LinearLayout的基础属性。

        相对布局在摆放子视图位置时,按照指定的参考系来摆放子视图的位置,默认以屏幕左上角(0,0)位置作为参考系摆放位置

        使用layout_below使得后面一个组件位于前面一个组件的下方

        配合layout_toRightOf使得后面一个组件位于前面一个组件的右方

        组件的默认位置都是左上角,组件之间可以重叠。像千层饼一样,一层压着一层 可以设置上下左右的对齐、水平垂直居中、设置方式与线性布局相似

        参考: Android从零入门到实战(Kotlin版)

Android UI绘制之View绘制的工作原理

        这是AndroidUI绘制流程分析的第二篇文章,主要分析界面中View是如何绘制到界面上的具体过程。

        ViewRoot 对应于 ViewRootImpl 类,它是连接 WindowManager 和 DecorView 的纽带,View的三大流程均是通过 ViewRoot 来完成的。在 ActivityThread 中,当 Activity 对象被创建完毕后,会将 DecorView 添加到 Window 中,同时会创建 ViewRootImpl 对象,并将 ViewRootImpl 对象和 DecorView 建立关联。

        measure 过程决定了 View 的宽/高, Measure 完成以后,可以通过 getMeasuredWidth 和 getMeasuredHeight 方法来获取 View 测量后的宽/高,在几乎所有的情况下,它等同于View的最终的宽/高,但是特殊情况除外。 Layout 过程决定了 View 的四个顶点的坐标和实际的宽/高,完成以后,可以通过 getTop、getBottom、getLeft 和 getRight 来拿到View的四个顶点的位置,可以通过 getWidth 和 getHeight 方法拿到View的最终宽/高。 Draw 过程决定了 View 的显示,只有 draw 方法完成后 View 的内容才能呈现在屏幕上。

        DecorView 作为顶级 View ,一般情况下,它内部会包含一个竖直方向的 LinearLayout ,在这个 LinearLayout 里面有上下两个部分,上面是标题栏,下面是内容栏。在Activity中,我们通过 setContentView 所设置的布局文件其实就是被加到内容栏中的,而内容栏id为 content 。可以通过下面方法得到 content:ViewGroup content = findViewById(R.android.id.content) 。通过 content.getChildAt(0) 可以得到设置的 view 。 DecorView 其实是一个 FrameLayout , View 层的事件都先经过 DecorView ,然后才传递给我们的 View 。

        MeasureSpec 代表一个位的int值,高2位代表 SpecMode ,低位代表 SpecSize , SpecMode 是指测量模式,而 SpecSize 是指在某种测量模式下的规格大小。

        SpecMode 有三类,如下所示:

        UNSPECIFIED

        EXACTLY

        AT_MOST

        LayoutParams需要和父容器一起才能决定View的MeasureSpec,从而进一步决定View的宽/高。

        对于顶级View,即DecorView和普通View来说,MeasureSpec的转换过程略有不同。对于DecorView,其MeasureSpec由窗口的尺寸和其自身的LayoutParams共同确定;

        对于普通View,其MeasureSpec由父容器的MeasureSpec和自身的Layoutparams共同决定;

        MeasureSpec一旦确定,onMeasure就可以确定View的测量宽/高。

        小结一下

        当子 View 的宽高采用 wrap_content 时,不管父容器的模式是精确模式还是最大模式,子 View 的模式总是最大模式+父容器的剩余空间。

        View 的工作流程主要是指 measure 、 layout 、 draw 三大流程,即测量、布局、绘制。其中 measure 确定 View 的测量宽/高, layout 确定 view 的最终宽/高和四个顶点的位置,而 draw 则将 View 绘制在屏幕上。

        measure 过程要分情况,如果只是一个原始的 view ,则通过 measure 方法就完成了其测量过程,如果是一个 ViewGroup ,除了完成自己的测量过程外,还会遍历调用所有子元素的 measure 方法,各个子元素再递归去执行这个流程。

        如果是一个原始的 View,那么通过 measure 方法就完成了测量过程,在 measure 方法中会去调用 View 的 onMeasure 方法,View 类里面定义了 onMeasure 方法的默认实现:

        先看一下 getSuggestedMinimumWidth 和 getSuggestedMinimumHeight 方法的源码:

        可以看到, getMinimumWidth 方法获取的是 Drawable 的原始宽度。如果存在原始宽度(即满足 intrinsicWidth > 0),那么直接返回原始宽度即可;如果不存在原始宽度(即不满足 intrinsicWidth > 0),那么就返回 0。

        接着看最重要的 getDefaultSize 方法:

        如果 specMode 为 MeasureSpec.UNSPECIFIED 即未指定模式,那么返回由方法参数传递过来的尺寸作为 View 的测量宽度和高度;

        如果 specMode 不是 MeasureSpec.UNSPECIFIED 即是最大模式或者精确模式,那么返回从 measureSpec 中取出的 specSize 作为 View 测量后的宽度和高度。

        看一下刚才的表格:

        当 specMode 为 EXACTLY 或者 AT_MOST 时,View 的布局参数为 wrap_content 或者 match_parent 时,给 View 的 specSize 都是 parentSize 。这会比建议的最小宽高要大。这是不符合我们的预期的。因为我们给 View 设置 wrap_content 是希望View的大小刚好可以包裹它的内容。

        因此:

        如果是一个 ViewGroup,除了完成自己的 measure 过程以外,还会遍历去调用所有子元素的 measure 方法,各个子元素再递归去执行 measure 过程。

        ViewGroup 并没有重写 View 的 onMeasure 方法,但是它提供了 measureChildren、measureChild、measureChildWithMargins 这几个方法专门用于测量子元素。

        如果是 View 的话,那么在它的 layout 方法中就确定了自身的位置(具体来说是通过 setFrame 方法来设定 View 的四个顶点的位置,即初始化 mLeft , mRight , mTop , mBottom 这四个值), layout 过程就结束了。

        如果是 ViewGroup 的话,那么在它的 layout 方法中只是确定了 ViewGroup 自身的位置,要确定子元素的位置,就需要重写 onLayout 方法;在 onLayout 方法中,会调用子元素的 layout 方法,子元素在它的 layout 方法中确定自己的位置,这样一层一层地传递下去完成整个 View 树的 layout 过程。

        layout 方法的作用是确定 View 本身的位置,即设定 View 的四个顶点的位置,这样就确定了 View 在父容器中的位置;

        onLayout 方法的作用是父容器确定子元素的位置,这个方法在 View 中是空实现,因为 View 没有子元素了,在 ViewGroup 中则进行抽象化,它的子类必须实现这个方法。

        1.绘制背景( background.draw(canvas); );

        2.绘制自己( onDraw );

        3.绘制 children( dispatchDraw(canvas) );

        4.绘制装饰( onDrawScrollBars )。

        dispatchDraw 方法的调用是在 onDraw 方法之后,也就是说,总是先绘制自己再绘制子 View 。

        对于 View 类来说, dispatchDraw 方法是空实现的,对于 ViewGroup 类来说, dispatchDraw 方法是有具体实现的。

        通过 dispatchDraw 来传递的。 dispatchDraw 会遍历调用子元素的 draw 方法,如此 draw 事件就一层一层传递了下去。dispatchDraw 在 View 类中是空实现的,在 ViewGroup 类中是真正实现的。

        如果一个 View 不需要绘制任何内容,那么就设置这个标记为 true,系统会进行进一步的优化。

        当创建的自定义控件继承于 ViewGroup 并且不具备绘制功能时,就可以开启这个标记,便于系统进行后续的优化;当明确知道一个 ViewGroup 需要通过 onDraw 绘制内容时,需要关闭这个标记。

        参考:《Android开发艺术探索》

Android UI布局

       æˆ‘有类似的布局

       <LinearLayout

                           android:id="@+id/lyApp"

                           android:layout_width="match_parent"

                           android:layout_height="0dp"

                           android:layout_marginLeft="5dp"

                           android:layout_marginTop="dp"

                           android:layout_weight="1"

                           android:background="@drawable/app"

                           android:gravity="center_horizontal" >

                           <LinearLayout

                               android:layout_width="wrap_content"

                               android:layout_height="match_parent"

                               android:gravity="left"

                               android:orientation="vertical" >

                               <TextView

                                   android:id="@+id/mtxt"

                                   android:layout_width="wrap_content"

                                   android:layout_height="0dp"

                                   android:layout_weight="1"

                                   android:gravity="center"

                                   android:text="我的图像"

                                   android:textColor="#FFFFFF"

                                   android:textSize="dp" />

                               <TextView

                                   android:id="@+id/mtxt"

                                   android:layout_width="wrap_content"

                                   android:layout_height="0dp"

                                   android:layout_weight="1"

                                   android:gravity="right"

                                   android:text="点击进入专业影像处理模块"

                                   android:textColor="#FFFFFF" />

                           </LinearLayout>

                       </LinearLayout>

文章所属分类:综合频道,点击进入>>