【学习】Android中View的工作原理(下)——View的工作流程和自定义View

ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解 自定义视图详解。MeasureSpec,onMeasure,measureChildren等方法源码分析。 阅读详情

View的工作流程

measure、layout、draw三大流程

1.View的measure过程

View的measure过程由其measure方法来完成,measure方法是一个final类型的方法,这意味着子类不能重写此方法,在View的measure方法中会去调用View的onMeasure方法

在这里插入图片描述

setMeasuredDimension方法会设置View宽高的测量值,我们看一下getDefaultSize方法

getDefaultSize

在这里插入图片描述

getDefaultSize返回的大小就是measureSpec中的specSize就是View测量后的大小,这里多次提到测量后的大小,是因为View最终的大小是在layout阶段确定的,但是几乎所有情况下View的测量大小和最终大小是相等的。至于UNSPECIFIED情况,一般用于系统内部的测量过程,在这种情况下,View的大小为getDefaultSize的第一个参数size,即宽高分别为getSuggestedMinimumWidth和getSuggestedMinimumHeight这两个方法的返回值。

在这里插入图片描述

分析上图第二个,如果View没有设置背景,那么View的宽度为mMinWidth,而mMinWidth对应于android:minWidth这个属性所指定的值,因此View的宽度即为android:minWidth属性所指定的值。如果这个属性不指定,那么mMinWidth则默认为0,如果View指定了背景,则View的宽度为max(mMinWidth,mBackground.getMinimumWidth()).

getMinimumWidth方法

在这里插入图片描述

该方法返回的就是Drawable的原始宽度,前提是这个View有原始宽度,否则返回0。

总结getSuggestedMinimum

如果View没有设置背景,那么返回android:minWidth这个属性所指定的值,这个值可以为0,如果View设置了背景,则返回android:minWidth和背景这两者中的最大值。getSuggestedMinimum的返回值就是View在UNSPECIFIED情况下的测量宽高。从getDefaultSize方法来看,View的宽高由specSize决定,所以直接继承View的自定义控件需要重写onMeasure方法并设置wrap_content时的自身的大小,否则在布局中使用wrap_content就相当于使用match_parent。从上述代码中我们可以知道如果View在布局中使用了wrap_content,那么他的specmode是AT_MOST模式,在这种模式下它的宽高等于specSize。查表可得此时specSize为parentSize,而parentSize是父容器中目前可以使用的大小,也就是父容器当前剩余空间大小,显然,View的宽高就等于父容器当前剩余的空间大小,这种效果和布局中使用match_parent完全一致。

解决wrap_content失效问题

我们只需要给View指定一个默认的内部宽高(mWidth mHeight),并在wrap_content时设置此宽高即可,对于非wrap_content情形,我们沿用系统的测量值。这个默认的内部宽高大小如何指定根据需求。
在这里插入图片描述

ViewGroup的measure过程

对于ViewGroup来说,除了完成自己的measure过程,还会去遍历调用所有子元素的measure方法,各个子元素再递归去执行这个过程。和View不同的是,ViewGroup是一个抽象类,所以它没有重写View的onMeasure方法,但提供了一个measureChildren的方法。

measureChildren

在这里插入图片描述

上图中ViewGroup对每一个子元素进行measure

measureChild

在这里插入图片描述

measureChild取出子元素的LayoutParams,然后再通过getChildMeasureSpec来创建子元素的MeasureSpec,接着将MeasureSpec直接传给View的measure方法处理。

ViewGroup并没有定义其测量的具体过程,因为不同的ViewGroup子类有不同的布局特性,导致它们的细节各不相同。

分析LinearLayout的onMeasure

LineaarLayout的onMeasure

在这里插入图片描述

measureVertical的源码

由于太长只展示部分

在这里插入图片描述

系统会遍历每个子元素并执行measureChildBeforeLayout方法,这个方法内部会调用子元素的measure方法,这样各个子元素就开始依次进入measure过程,并且系统会通过mTotalLength这个变量来存储LinearLayout在竖直方向的初步高度。每测量一个子元素,mTotalLength就会增加,增加的部分主要包括了子元素的高度以及子元素在竖直方向上的margin等。当子元素测量完毕后,LinearLayout会测量自己的大小,如下图。
image.png
当子元素测量完毕后,LinearLayout会根据子元素的情况来测量自己的大小。针对竖直的LinearLayout而言,它在水平方向的测量过程遵循View的测量过程,在竖直方向的测量过程和View有所不同。具体指如果它的布局中高度采用match_parent或者具体数值,那么它的的量过程与View一致,即高度为SpecSize,如果布局中高度采用wrap_content,那么它的高度是所有子元素所占用的高度总和,但是仍然不能超过它的父容器的剩余空间,最终高度还要考虑其在竖直方向的padding。

上图中resolveSizeAndState源码

在这里插入图片描述

setMeasuredDimension方法源码

在这里插入图片描述

measure完成后,通过fetMeasuredWidth/Height方法就可以正确获取到View的测量宽高。需要注意在某些极端情况下系统可能需要多次measure才能确定最终的测量宽高,在这种情况下在onMeasure拿到的测量宽高可能是不准确的。一个比较好的习惯是从onLayout方法中去获取View的测量宽高或者最终宽高。

问题

当我们想在Activity已启动的时候就做一件任务,但这件任务需要获取某个View的宽高。但是在onCreate、onStart、onResume中均无法正确得到某个View的宽高信息,这是因为View的measure过程和Activity的生命周期方法不是同步执行的,因此无法保证。

解决办法

1.Activity/View#onWindowFocusChanged

这个方法的含义是:View已经初始化完毕了,宽高已经准备好了,这个时候去获取宽高是没有问题的。但是onWindowFocusChanged会被调用多次,当Activity的窗口得到焦点和失去焦点时都会被调用一次。也就是当Activity继续执行和暂停执行时,它都会被调用,如果频繁的进行onResume和onPause那么它也会被频繁调用。

在这里插入图片描述

所以可以通过重写该方法在其中获取宽高

在这里插入图片描述

在这里插入图片描述

2.view.post(runnable)

通过post可以将一个runnable投递到消息队列的尾部,然后等待Looper调用此runnable的时候View也初始化好了。
使用方法
在这里插入图片描述

3.ViewTreeObserver

使用Observer的众多回调可以完成这个功能,比如使用OnGlobalLayoutListener这个接口,当View树的状态发生改变或者View树内部的View的客家逆行发生改变时,onGlobalLayout方法将被回调,因此这是获取View的宽高一个很好的时机。伴随着View树的状态改变等,onGlobalLayout会被调用多次。

使用方法
在这里插入图片描述

在这里插入图片描述

4.view.measure(int widthMeasureSpec,int heightMeasureSpec)

通过手动对View进行measure来得到view的宽高,比较复杂,

要根据View的LayoutParams来分

1.match_parent

无法measure出具体的宽高,因为构造此种MeasureSpec需要parentSize而这个时候我们无法知道parentSize的大小。

2.具体数值

在这里插入图片描述

3.wrap_content

在这里插入图片描述

注意(1<<30)-1,View吃醋还能使用30位二进制表示,也就是说最大是30个1(2^30-1)也就是(1<<30)-1,在最大化模式下我们用View理论上能支持的最大值去构造MeasureSpec是合理的

measure的两种错误用法

在这里插入图片描述

2.layout过程

ViewGroup用于确定子元素的位置,当ViewGroup位置被确定后,它在onLayout中会遍历所有的子元素并调用其layout方法,在layout方法中onLayout方法又会被调用。Layout过程和measure过程相比较简单。layout方法确定View本身的位置,而onLayout方法则会确定所有子元素的位置。

下图为View的layout方法。
在这里插入图片描述

layout大致流程

先通过setFrame方法来设定View四个顶点的位置,即初始化mLeft,mRight,mTop,mBottom,View这四个顶点一旦确定,那么View在父容器中的位置也确定了,接着会调用onLayout方法,用于父容器决定子元素的位置,它的具体实现和具体的布局有关,所以View和ViewGroup都没有具体实现。
下图是LinearLayout的onLayout方法

在这里插入图片描述

选择layoutVertical讲解

在这里插入图片描述

该方法会遍历所有子元素并调用setChildFrame方法指定子元素的位置,其中childTop会逐渐增大,意味着后面的子元素会被放置在靠下的位置,正好符合竖直方向的LinearLayout的特性。setChildFrame只是调用子元素的layout方法而已,这样父容器在layout方法中完成自己的定位之后,就通过onLayout方法会调用子元素的layout方法,子元素有会通过自己的layout方法来确定自己的位置,这样一层一层完成了整个View树的layout过程。

以下是setChildFrame的源码

在这里插入图片描述

setChildFrame中的width和height实际上就是子元素的测量宽高

在这里插入图片描述

而在layout方法中会通过setFrame去设置子元素的四个顶点位置,在setFrame中有几句赋值语句来确定子元素的位置

在这里插入图片描述

View的测量宽高和最终宽高有什么区别?

这个问题可以具体为View的getMeasuredWidth和getWidth有什么区别
首先看一下getWidth的实现

在这里插入图片描述

结合mLeft等四个变量的赋值过程来看,getWidth方法的返回值刚好就是View的的测量宽度。在View的默认实现中,View的测量宽高和最终宽高是相等的,只不过测量宽高形成于View的measure过程,而最终宽高形成于View的layout过程,即两者的赋值时机不同,测量宽高的赋值时机要早一点。在日常开发中,我们可以认为View的测量宽高等于最终宽高,但是的确存在情况会导致两者不一致。

重写View的layout代码
在这里插入图片描述

上述代码会导致在任何情况下View的最终宽高总是比测量宽高大100px,虽然这么做会导致View显示不正常并且没有实际意义,但这证明了测量宽高的确可以不等于最终宽高。另外一种情况是在某些情况下View需要多次measure才能确定自己的测量宽高,在前几次的测量过程中,其得出的测量宽高有可能和最终宽高不一致,但最终来说两者相同。

draw过程

draw步骤

1.绘制背景 background.draw(canvas)
2.绘制自己 onDraw
3.绘制children dispatchDraw
4.绘制装饰 onDrawScrollBars //在新版本中已经改为onDrawForeground方法,在该方法中调用了onDrawScrollBars

draw源码

在这里插入图片描述

View的绘制过程传递是通过dispatchDraw来实现的,dispatchDraw会遍历调用所有子元素的draw方法,如此draw事件就一层一层的传递下去

View的一个特殊方法setWillNotDraw

在这里插入图片描述

如果一个view不需要绘制任何内容那么设置这个标记位为true以后,系统会进行相关优化。ViewGroup默认启动该标记位,View默认不启动。当我们的自定义控件继承于ViewGroup并且自身并不具备绘制功能时,就可以开启这个标记位从而便于系统进行后续的优化。当明确知道一个ViewGroup需要通过onDraw来绘制内容时我们需要显式关闭这个标记位。

自定义View

自定义View的分类

1.继承View重写onDraw方法

主要用于实现一些不规则的效果,即这种效果不方便通过布局的组合方式来达到,往往需要静态或者动态地现实一些不规则的图形。显然这需要通过绘制的方式来实现,即重写onDraw方法。采用这种方式需要自己直至wrap_content并且padding也要自己处理。

2.继承ViewGroup派生特殊的Layout

主要用于实现自定义布局,当某种效果看起来很像几种View组合在一起的时候,可以采用这种方法来实现。需要合适地处理ViewGroup的测量、布局两个过程,并同时处理子元素的测量和布局过程

3.继承特定的View

比较常见,一般是用于扩展某种已有的View的功能,比较容易,不需要自己支持wrap_content和padding

4.继承特定的ViewGroup

比较常见,不需要自己处理ViewGroup的测量和布局,理论上2能实现的效果方法4也能,但2更接近View的底层

自定义View须知

1.让View支持wrap_content

如果不对其做特殊处理那么当外界在布局使用它时就无法达到预期效果

2.若有必要让你的view支持padding

因为直接继承View的控件如果不在draw方法中处理padding,那么padding属性是无法起作用的。直接继承自ViewGroup的控件需要在onMeasure和onLayout中考虑padding和子元素的margin对其造成的影响,不然会导致padding和子元素的margin失效。

3.尽量不要在View中使用Handler

因为View内部本身就提供了post方法完全可以替代Handler

4.View中如果有线程或者动画,需要及时停止,参考View#onDetachedFromWindow

如果有线程或者动画需要停止时那么onDetachedFromWindow是一个很好的时机。当包含此View的Activity退出或当前View被remove时,这个方法会被调用,和此方法对应的是onAttachedToWindow,它会在包含此View的Activity启动时调用。当View变得不可见时我们也需要停止,否则有可能造成内存泄漏

5.View带有滑动嵌套情形时,处理好滑动冲突

自定义View示例

自定义的Circle代码1.0


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

import androidx.annotation.Nullable;

public class Circle extends View {

    private int mColor= Color.BLUE;
    private Paint mPaint=new Paint(Paint.ANTI_ALIAS_FLAG);

    private void init(){
        mPaint.setColor(mColor);
    }

    public Circle(Context context) {
        super(context);
        init();
    }

    public Circle(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public Circle(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public Circle(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int width=getWidth();
        int height=getHeight();
        int radius=Math.min(width,height)/2;
        canvas.drawCircle(width/2,height/2,radius,mPaint);
    }
}

上面的代码定义了一个具有圆形效果的自定义View,它会在自己的中心点以宽高的最小值为直径绘制一个蓝色的实心圆

Activity_main.xml代码

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <com.rdc.testforlearn.Circle
        app:layout_constraintTop_toTopOf="parent"
        android:id="@+id/circle"
        android:background="@color/black"
        android:layout_width="match_parent"
        android:layout_height="100dp"/>

</androidx.constraintlayout.widget.ConstraintLayout>

展示效果

在这里插入图片描述

再设置20dp的margin

    app:layout_constraintTop_toTopOf="parent"
    android:id="@+id/circle"
    android:background="@color/black"
    android:layout_margin="20dp"
    android:layout_width="match_parent"
    android:layout_height="100dp"/>

显示效果

在这里插入图片描述

设置20dp的padding

    app:layout_constraintTop_toTopOf="parent"
    android:id="@+id/circle"
    android:background="@color/black"
    android:layout_margin="20dp"
    android:padding="20dp"
    android:layout_width="match_parent"
    android:layout_height="100dp"/>

显示效果

在这里插入图片描述

padding没有生效,因为我们前面提到过直接继承自View和ViewGroup的控件,padding是默认无法生效的,需要自己处理

修改width的模式(顺便修改了一下布局)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <com.rdc.testforlearn.Circle
        android:id="@+id/circle"
        android:background="@color/black"
        android:layout_margin="20dp"
        android:padding="20dp"
        android:layout_width="wrap_content"
        android:layout_height="100dp"/>

</LinearLayout>

显示效果

在这里插入图片描述

wrap_content并没有起到预期效果,通过对比我们可以发现使用match_parent和wrap_content没有任何区别。这一点在前面也已经提到过:对于直接继承自View的控件,如果不对wrap_content做特殊处理就相当于使用match_parent。

解决办法

1.wrap_content

为其指定一个wrap_content模式下的默认宽高即可

在Circle类中增加如下代码

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int widthSpecMode=MeasureSpec.getMode(widthMeasureSpec);
    int heightSpecMode=MeasureSpec.getMode(heightMeasureSpec);
    if (widthSpecMode==MeasureSpec.AT_MOST&&heightSpecMode==MeasureSpec.AT_MOST){//当宽高都为wrap_content时
        setMeasuredDimension(200,200);//设置默认值
    }else if(widthSpecMode==MeasureSpec.AT_MOST){//当宽为wrap_content时
        setMeasuredDimension(200,200);
    }else if(heightSpecMode==MeasureSpec.AT_MOST){//当高为wrap_content时
        setMeasuredDimension(200,200);
    }
}

显示效果

在这里插入图片描述

2.padding

修改onDraw如下

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    int paddingLeft=getPaddingLeft();
    int paddingRight=getPaddingLeft();
    int paddingTop=getPaddingLeft();
    int paddingBottom=getPaddingLeft();
    int width=getWidth()-paddingLeft-paddingRight;
    int height=getHeight()-paddingTop-paddingBottom;
    int radius=Math.min(width,height)/2;
    canvas.drawCircle(paddingLeft+width/2,paddingTop+height/2,radius,mPaint);
}

中心思想就是绘制时考虑到View四周的空白即可,其中圆心和半径都会考虑到View四周的padding

显示效果

在这里插入图片描述

自定义属性

添加步骤
1.在values目录下创建自定义属性的XML,比如attrs.xml,也可以选择类似attrs_circle_view.xml等这种以attrs_开头的文件名,文件名并没有什么限制,可以随便取。
创建attrs.xml

在这里插入图片描述

在上面的xml中声明了一个自定义属性集合Circle,在这个集合里面可以有很多自定义属性,这里的格式color指的是颜色。除了颜色格式,自定义属性还有其他格式,比如reference指的是资源id,dimension指尺寸,而像string integer boolean这种指基本数据类型等等。

2.在View的构造方法中解析自定义属性的值并做相应处理

在这里插入图片描述

首先加载自定义属性集合Circle,接着解析Circle属性集合中的circle_color。在这一步骤中,如果在使用时没有指定circle_color这个属性,那么就会选择红色作为默认的颜色,解析完属性后,通过recycle方法来实现资源。

在这里插入图片描述

上图是书中的构造方法,注意第二个构造函数调用了本类的第三个构造方法,在正常情况下,第一个构造函数在动态创建一个view的时候调用,第二个构造函数在xml静态调用的时候调用,第三个调用方法要在第一或者第二个构造函数显式调用才会执行。

xml修改如下

在这里插入图片描述

需要注意为了使用自定义属性,必须在布局文件中添加schemas声明:xmlns:app=“http://schemas.android.com/apk/res-auto” app是自定义属性的前缀,也可以换成其他名字,相应的下方属性也得更改名字。

显示效果

在这里插入图片描述

关于自定View的ViewGroup (嵌套View) 自定义ViewGroup 阅读详情

相关推荐

Android View工作原理:测量、布局、绘制流程 & 自定义View

#.概述 ##.PhoneWindow中的DecorView是根布局 Android中Window是显示和管理View的载体,其实现类是PhoneWindow。 所有View是按照树的逻辑结构来管理的,父View有多个子View节点,子View节点又可以有多个View节点。 而这棵View树的根节点是PhoneWindow中的根布局,一个DecorView,DecorView由两部分构成: ActionBar(操作条区域,顶部用于显示标题和几个操作...

u013914309的博客 1314

Android View中的setMeasuredDimension方法

继承View,实现自己想要的组件,那么需要使用到setMeasuredDimension这个方法,这个方法决定了当前View的大小,请看代码: View的代码: Java代码   package cc.mdev.test;      import android.content.Context;   import android.graphics.Canva

Working harder, getting stronger! 4万+

Android自定义View详解(实现、工作流程、使用场景和优化)

在Android开发中,组合控件是一种常见且实用的自定义View实现方式。通过组合多个现有控件,开发者可以快速地构建出具有特定功能和外观的新控件,从而满足不同的UI需求。这种方法的优势在于其高效性和灵活性,能够充分利用Android提供的丰富控件资源,减少不必要的重复开发工作。在实际应用中,组合控件的实现通常涉及以下几个关键步骤。首先,开发者需要明确自定义View的具体需求和功能定位,这有助于确定所需组合的控件类型及其布局方式。

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

Android自定义控件(UI,点击事件)

Android自定义控件(UI,点击事件)

fusu2178192的博客 1675

深入浅出:.sh文件在Linux系统中的实战应用与技巧

本文深入浅出地介绍了.sh文件在Linux系统中的实战应用与技巧。从基础概念入手,详细讲解了Bash脚本的运行方法、权限管理,并通过编写自动化备份脚本等实例,展示了如何利用Shell脚本提升工作效率。文章还涵盖了脚本调试、错误处理以及函数、参数解析等进阶技巧,帮助读者从入门到精通,掌握这一强大的自动化工具。

weixin_29243279的博客 350

超实用!用ChimeraX对AlphaFold 结果可视化(中): 蛋白结构美化篇

而一般需要的背景颜色是无色(白色),有三种方法可以更改背景颜色,这里我们介绍两种方法,第三种在下一小节中讲解。如果想选中蛋白链中的某一结构区域或者某些位点,可以用Ctrl+Shift+鼠标左键,或在软件窗口中点击。在这个窗口中可以对蛋白的主链、侧链、表面等颜色进行修改,只用在。,即可在右下角看到我们蛋白的序列信息,在这里面直接用鼠标选择要选择的结构域。就会有更多的颜色供我们选择,如果有特定的色号还可以在这个界面继续选择。后面的颜色(②),就可以选择想要的任何背景颜色(③)。就可以选择软件推荐的常用颜色。

m0_63153079的博客 5485

android 对象继承重写,继承ViewGroup:重写onMeasure方法和onLayout、requestlayout方法

在继承ViewGroup类时,需要重写两个方法,分别是onMeasure和onLayout。1,在方法onMeasure中调用setMeasuredDimension方法void android.view.View.setMeasuredDimension(int measuredWidth, int measuredHeight)在onMeasure(int, int)中,必须调用setMeas...

weixin_42143161的博客 766

esim分布式云卡池技术

eSIM卡,即Embedded-SIM,嵌入式SIM卡。eSIM卡的概念就是将传统SIM卡直接嵌入到设备芯片上,而不是作为独立的可移除零部件加入设备中,用户无需插入物理SIM卡。这一做法将允许用户更加灵活的选择运营商套餐,或者在无需解锁设备、购买新设备的前提下随时更换运营商。未来通用的eSIM标准建立将为普通消费者、企业用户节省更多移动设备使用成本,并带来更多的便利、安全性。 2018年 3月7日,中国联通宣布,正式在上海、天津、广州、深圳、郑州、长沙6座城市率先启动“eSIM一号双终端”业务的办理。[.

著名博客 3708

深入解析Android中View的工作原理

当子元素测量完毕后,LinearLayout会测量自身的大小,对于竖直的LinearLayout,它在水平方向上的测量过程,遵循View的测量过程,在竖直方向上,如果采用的是match_parent或者具体的数值,那么它的测量过程和View的一致,即高度为specSize;1.MeasureSpec很大程度上决定一个View的尺寸规格,测量过程中,系统会将View的layoutParams根据父容器所施加的规则转换成对应的MeasureSpec,再根据这个measureSpec来测量出View的宽/高。

Android_XG的博客 2192

考试遇到 Assistant API 考点时,该掌握哪些要点?

【摘要】聚焦阿里云大模型 ACP 认证中智能体 Assistant API 考点,我结合自学认证成功经验,分享复习攻略。先解析 assistants、threads 等五个核心组件作用与关系,点明各组件支持及不支持的方法,最后给出计算 Python 代码调用大模型次数的思路,助力考生攻克考点、顺利拿证 。

davidkorhenn的博客 495

【ArcGIS微课1000例】0149:Geographic Imager6.6下载安装教程

首先保证电脑上安装对应版本的PS软件,笔者安装的是PS2023(V24.7)版本,然后安装本软件。保持以上窗口运行状态,然后打开PS,自动弹出如下窗口。勾选【Automatically checkout LIcense】,点击Close。双击setup开始安装,点击【确认】,一路默认安装到底。驱动器:DVD-ROM驱动器(用于DVD版本)处理器:2GHz或更快的英特尔或AMD处理器。安装完成后,将Crack中的所有文件拷贝到。硬盘:600 MB的可用硬盘空间用于安装。内存:4GB内存(建议8GB或更高)。

智慧空间实验室 1219

【Android】View工作原理

View是Android在视觉上的呈现在界面上Android提供了一套GUI库,里面有很多控件,但是很多时候我们并不满足于系统提供的控件,因为这样就意味这应用界面的同类化比较严重。那么怎么才能做出与众不同的效果呢?答案是自定义View,也可以叫自定义控件,通过自定义View我们可以实现各种五花八门的效果。除了View的三大流程以外,View常见的回调方法也是需要熟练掌握的,比如构造方法、onAttach、onViVisibilityChanged、onDetach等。

2301_79977698的博客 1431

支付宝域名如何加入白名单(扫码老是弹窗)

支付宝扫码之后,遇到非支付宝官方网页,请确认是否继续访问弹窗,问题解决办法。本章教程提供解决办法,亲测有效。

猿小白的博客 9196

Android自定义View的基石——View工作原理总结

前言 View可以说是我们在Android开发中接触得最多的一个类了,虽然不属于四大组件,但是发挥的作用却一点都不亚于四大组件,页面中的各种控件、布局都直接或间接地继承自View,可以说View无处不在。因而了解View的工作原理能让我们更好地处理开发中的诸多问题,尤其是对于老生常谈的自定义View来说,View的工作原理更是必须要掌握的。 在进入正文之前还是要强调一下,本文的分析基于Andr...

快乐丸的博客 1531

【红外DDE算法】一种应用于高动态范围红外可视化的算法

【红外DDE算法】一种应用于高动态范围红外可视化的算法 - 这个算法背后的动机 - 展示这个算法的流程 - 然后讨论各个可调参数的意义。

sunwindl91181的博客 1683

RK3588与FocalTech触摸屏代码适配全解析:从原理到实战

摘要:本文详细介绍了瑞芯微RK3588处理器与FocalTech触摸屏的适配过程,包括硬件特性、驱动加载、设备树配置和常见问题解决方案。RK3588作为8nm工艺的高性能处理器,具备强大的计算能力和丰富的接口资源;FocalTech触摸屏则采用电容式技术,支持I2C/SPI接口。适配关键步骤包括驱动程序加载、硬件连接检查、设备树配置和内核版本兼容性处理,并提供了代码示例和问题排查方法。随着嵌入式设备智能化发展,该适配技术将持续优化,为智能交互提供更优解决方案。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 272

06. View工作原理

扁平化视图层级:每个视图层级都会增加measure和layout的复杂度。扁平化视图层级可以减少measure和layout的调用自定义 ViewGroup 优化布局逻辑:默认的ViewGroup测量逻辑会遍历所有子视图,可能造成性能浪费。我们可以 通过自定义ViewGroup的测量逻辑来优化性能避免在onDraw中分配对象:这会导致频繁的内存分配和垃圾回收(GC)。优化invalidate:调用会触发onDraw,过于频繁的调用会增加 CPU 和 GPU 的负担。避免不必要的调用。

qq_35829566的博客 1402

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

揭开Android View的神秘面纱:深入探索工作原理

在 Android 开发中,自定义 View 是实现个性化界面和独特交互效果的重要手段。根据不同的需求和场景,自定义 View 主要分为以下几种常见类型,每种类型都有其独特的实现要点和挑战。继承 View 类是最基础的自定义 View 方式,适用于需要实现完全自定义的绘制效果,无法通过现有控件组合来实现的场景。在这种方式下,开发者需要重写 onDraw 方法,使用 Canvas 和 Paint 来绘制各种图形、文本和图像,以实现所需的视觉效果。

顾林海 3126

WINCC7.3破解文件

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

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

安卓开发之View工作原理

前面已经介绍了View的事件分发以及处理机制,这次来学习下View的工作流程,学习之前要先了解一些基础知识。 View位置参数 我们知道安卓中坐标系是以屏幕的左上角为坐标原点,向右为x轴增大方向,向下为y轴增大方向。View坐标系也是这样,内部关系如下图所示: 其中**getLeft()、getTop()、getRight()、 getBottom()**分别对应View的四个属性:left、top、right、bottom,分别代表相对于View父容器的左上角的横坐标(left)、左上角的纵坐标(top

iris的博客 642

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Android进阶 View的工作原理:源码分析View的三大工作流程

想象一下,如果我们要画画,把画画的流程拆分的话,那么应该分几个部分呢?一般来说,专业的画师会进行提前构图,然后再进行绘画最后上色。实际上Android系统把各种控件显示到屏幕也相当于是系统在进行绘画,也需要把绘画的过程分为几个大的步骤,这就是View的工作流程。 View的工作流程可以分为三个步骤: 1. 测量(确定各个控件的大小尺寸和位置) 2. 放置(将控件放置到指定位置和大小) 3. 绘制(将控件渲染显示出来,这之后我们才能看到) 本篇文章就是主要介绍**系统如何绘制各种各样的View控件**的三

Tai_Monster的博客 1178

Android进阶学习(四)View的工作原理

Android进阶学习(四)View的工作原理View的工作原理1 初识ViewRoot和DecorView2 理解MeasureSpec2.1 MeasureSpec2.2 MeasureSpec和LayoutParams对应关系3. View的工作流程3.1 measure过程3.1.1 View的measure3.1.2 ViewGroup的measure3.2 layout过程3.3 dr...

qq_37149418的博客 265

Android View的工作原理

自定义View是一个综合的技术体系,它涉及View的层次结构、事件分发机制和View的工作原理等细节。自定义View的分类1.继承View重新onDraw主要是实现一些不规则的图形。重写onDraw方法。采用这种方式需要自己支持wrap_content, 并且padding也需要自己处理。2.继承ViewGroup派生特殊的Layout。

huaihong1986的博客 981

android view的工作原理(一)

前言: 在界面上Android 提供一套GUI库,里面有很多控件,但是很多时候我们并不满足于系统系统的控件,造成应用界面的同类化比较严重,所以我们需要自定义view,可以实现不同的效果,为了更好的自定义view.还需要掌握View的底层工作原理。例如:view的测量流程。布局流程以及绘制流程,这样我们就能定义自己想要的效果 自定义view有几种固定的类型的。有的直接继承自view和viewGr...

wk_先森的博客 4744

Android进阶知识——View的工作原理

文章目录1.初识ViewRoot和DecorView 本章我们主要介绍两个方面的内容,首先介绍View的工作原理,接着介绍自定义View的实现方式。 有的时候我们可能想要在界面上实现一些比较华丽的效果,而往往系统提供的现有控件并不能满足我们的需求,这个时候我们就需要使用自定义View了。为了更好地自定义View,还需要掌握View的底层工作原理,比如View的测量流程、布局流程以及绘制流程。除了View的三大流程以外,View常见的回调方法也是需要熟练掌握的,比如构造方法、onAttach、onVisibi

ABded的博客 512

Android——View的工作原理

前言 要想实现自定义View,那么需掌握View的事件体系及其底层工作原理,本节主要围绕View的工作原理来开展,View的事件体系可见另一篇文章。 View的底层工作原理主要涉及到三个流程:View的测量(measure)、View的布局(layout)、View的绘制(draw)。除了这三大基本流程外,有几个View的回调方法也需掌握,如:构造方法、onAttach、onVisibilityChanged、onDetach等等。 自定义View的实现,主要有几种固定类型,有的继承View或者ViewGr

shu_lance的博客 507
上一篇: 【学习】Android中View的工作原理(上)——ViewRoot、DecorView、MeasureSpec
下一篇: 【学习】Android的RemoteViews
Panic  Lin
博客等级 码龄6年 81粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值