Android View绘制流程

一、安卓绘图流程

在Android平台上,图形的渲染和显示过程是非常复杂的。主要包括以下几个处理步骤:

1、将显示内容从应用程序发送到系统框架 ,

2、把图形数据传递到OpenGL ES图形引擎去处理,

3、OpenGL ES返回一组最终的像素值,此时保存在图像缓冲区里

4、Android系统把这些像素复制到显示缓存区,完成最终的显示操作。

整个过程除了第1个步骤,都是通过系统内部多个进程进行的,因此这个过程实际上并不需要开发人员额外关心。

二、Android View绘制流程

View是Android应用程序的界面元素,任何绘制单元在屏幕上的显示都必须通过它才能实现。它在Android的绘制流程中是非常重要的一个环节。以下是Android View绘制流程的详细介绍:

1、构建视图层次

视图层次是指View的树形结构,由一个或多个View和 ViewGroup组成。当应用程序启动时,Android运行时系统会创建一个视图层次,即Activity / Fragment 中的setContentView()中指定的布局。在Android中视图的层次结构可以通过findViewById方法获取。

View view = findViewById(R.id.view_id);

2、测量过程

View被绘制之前,需要先测量出它的尺寸和大小。在测量过程中,系统会要求每一个View通过onMeasure()来计算自己的宽度和高度,该方法在View对象中实现,是View类的抽象方法之一。在每次事件分发的开始时,会自动触发View的测量过程。

举个例子,我们在Activity中创建一个TextView,然后通过日志来输出它的宽度和高度:

TextView textView = findViewById(R.id.textview_id);
int widthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
textView.measure(widthMeasureSpec, heightMeasureSpec);
Log.d("TAG", "TextView width: " + textView.getMeasuredWidth() + " height: " + textView.getMeasuredHeight());

3、布局过程

布局过程是指确定View在视图层次中的位置和大小。在这个过程中,会通过onLayout()方法确定View的四个顶点坐标,即left、top、right、bottom。如果是ViewGroup,会在这个方法中对自己的子View进行布局。

下面是一个简单的自定义ViewGroup的例子,自定义ViewGroup通过LayoutParams添加子View,重写onLayout()方法对子View进行布局。

public class CustomLayout extends ViewGroup {
 
    public CustomLayout(Context context) {
        this(context, null);
    }
 
    public CustomLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
 
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int height = MeasureSpec.getSize(heightMeasureSpec);
        setMeasuredDimension(width, height);
    }
 
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        final int count = getChildCount();
        int curWidth, curHeight, curLeft, curTop, maxHeight;
 
        final int childLeft = this.getPaddingLeft();
        final int childTop = this.getPaddingTop();
 
        maxHeight = 0;
        curLeft = childLeft;
        curTop = childTop;
 
        for (int i = 0; i = r) {
                curLeft = childLeft;
                curTop += maxHeight;
                maxHeight = 0;
            }
 
            child.layout(curLeft, curTop, curLeft + curWidth, curTop + curHeight);
            if (maxHeight < curHeight)
                maxHeight = curHeight;
            curLeft += curWidth;
        }
    }
}

4、绘制过程

绘制过程是指在View的结构确定后,将View及其子View绘制到屏幕上的机制。在这个过程中,会通过onDraw()方法,将View显示到屏幕上。最后会把所有View的绘制结果合并,并复制到Frame Buffer中,通过Surface给显示屏幕显示。

下面是一个简单的自定义View的例子,通过onDraw()方法绘制一个矩形和圆形:

public class CustomView extends View {
 
    private Paint mPaint = new Paint();
    private int mWidth;
    private int mHeight;
 
    public CustomView(Context context) {
        this(context, null);
    }
 
    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPaint.setColor(Color.BLACK);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(4);
    }
 
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
 
        canvas.drawRect(mWidth / 4, mHeight / 4, mWidth * 3 / 4, mHeight * 3 / 4, mPaint);
        canvas.drawCircle(mWidth / 2, mHeight / 2, mWidth / 4, mPaint);
    }
 
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        mWidth = MeasureSpec.getSize(widthMeasureSpec);
        mHeight = MeasureSpec.getSize(heightMeasureSpec);
    }
}

三、结论

因为Android平台的绘制和显示过程是非常复杂而且固定的。所以很多开发人员不需要了解细节,只需要知道Android提供的一系列API即可实现各种视图的绘制和显示。当然,对于一些对视图的自定义更多的应用,需要掌握更多的内容和技巧。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/286921.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-23 13:06
下一篇 2024-12-23 13:06

相关推荐

  • Android ViewPager和ScrollView滑动冲突问题

    Android开发中,ViewPager和ScrollView是两个常用的控件。但是当它们同时使用时,可能会发生滑动冲突的问题。本文将从多个方面介绍解决Android ViewPa…

    编程 2025-04-28
  • Android如何点击其他区域收起软键盘

    在Android应用中,当输入框获取焦点弹出软键盘后,我们希望能够点击其他区域使软键盘消失,以提升用户体验。本篇文章将说明如何实现这一功能。 一、获取焦点并显示软键盘 在Andro…

    编程 2025-04-28
  • Python爬虫流程用法介绍

    本文将介绍Python爬虫的流程,包括数据采集、数据处理以及数据存储等方面。如果想要使用Python爬取网站数据,本文将为您提供详细的指导和实例。 一、数据采集 1、确定目标网站 …

    编程 2025-04-27
  • Java项目Git发布流程规范

    本文旨在介绍Java项目在使用Git进行发布时的流程规范。Git作为一个版本控制工具,其功能十分强大,但是对于Java项目进行发布时,需要我们根据标准化的流程规范来执行操作,以确保…

    编程 2025-04-27
  • Android Studio HUD 实现指南

    本文将会以实例来详细阐述如何在 Android Studio 中使用 HUD 功能实现菊花等待指示器的效果。 一、引入依赖库 首先,我们需要在 build.gradle 文件中引入…

    编程 2025-04-27
  • Android和Vue3混合开发方案

    本文将介绍如何将Android和Vue3结合起来进行混合开发,以及其中的优势和注意事项。 一、环境搭建 在进行混合开发之前,需要搭建好相应的开发环境。首先需要安装 Android …

    编程 2025-04-27
  • Android Java Utils 可以如何提高你的开发效率

    Android Java Utils 是一款提供了一系列方便实用的工具类的 Java 库,可以帮助开发者更加高效地进行 Android 开发,提高开发效率。本文将从以下几个方面对 …

    编程 2025-04-27
  • xmake qt:构建Qt应用的全流程解决方案

    本文将会详细阐述xmake qt的使用方法以及其能够解决的问题。针对Qt应用开发中的各种困境,xmake提供了一整套的解决方案,包括自动构建、依赖管理、部署打包等,极大地提高了开发…

    编程 2025-04-27
  • Android JUnit测试完成程序自动退出决方法

    对于一些Android JUnit测试的开发人员来说,程序自动退出是一个经常面临的困扰。下面从多个方面给出解决方法。 一、检查测试代码 首先,我们应该仔细检查我们的测试代码,确保它…

    编程 2025-04-25
  • Android Activity启动流程

    一、Activity概述 Android应用程序是由许多Activity组成的。一个Activity代表一个屏幕上的窗口。用户与应用程序交互时,Activity会接收用户的输入并处…

    编程 2025-04-25

发表回复

登录后才能评论