Android View解析

一、什么是View?

1.View是用户接口组件的基本构建块;

2.View在屏幕上占据一个矩形区域;

3.View通过绘制自己与事件处理两种方式与用户交互

设计View,主要是为了让应用能够与用户交互,要想完成交互,这个View就要在屏幕上占据一个矩形区域,然后利用这块屏幕区域与用户交互,交互的方式就两种,绘制自己与事件处理。

二、如何管理View?

Google的解决方案是:首先,一套完整的用户界面用一个Window来表示,Window首先加载一个超级复合View,用它来包含住所有的其他View,这个超级复合View就叫做DecorView

不同的View为了完成自己的交互任务所需要的屏幕区域大小是不同的,所以DecorView在确定给每个View分配的屏幕区域大小时,是允许View参与进来,与它一起商量的。但是每个View在屏幕区域中的位置就不能让View自己来决定了,而是由DecorView一手操办。

Activity中window和decorview的加载流程:

  • Activity管理着Window,Window管理着DecorView,Activity间接管理着DecorView
  • Activity处在“create"状态的时候创建对应的Window,并在setContentView里创建 DecorView,最终添加自定义布局到DecorView里。此时,Activity创建完毕,Window创建完毕,DecorView创建完毕,ViewTree构建成功,三者关系已建立。
  • Acitivity处在“resume"状态的时候,通过Window的管理类将DecorView添加到Window里,并提交更新DecorView的请求。当下次屏幕刷新信号到来之时,执行ViewTree三大流程(测量,布局,绘制),最终的效果就是我们的自定义布局显示在屏幕上。 “注”:指的状态执行时机是处在ActivityThread里的。

2.1 确定每个View的位置

虽然View无法决定自己在ViewGroup中的位置,但是开发者在使用View时,可以向ViewGroup表达自己所用的View要放在哪里。(xml 布局文件)

2.2 确定View大小

        2.2.1  开发者向ViewGroup表达的,我这个View需要的大小是多少;

        2.2.2  ViewGroup收到了开发者对View大小的说明,然后ViewGroup会综合考虑自己的空间大小以及开发者的请求,然后生成两个MeasureSpec对象(width与height)传给View,这两个对象是ViewGroup向子View提出的要求;两个对象将会传到子View的protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)方法中

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int desiredWidth = // 计算所需宽度;
    int desiredHeight = // 计算所需高度;

    int widthMode = MeasureSpec.getMode(widthMeasureSpec);
    int widthSize = MeasureSpec.getSize(widthMeasureSpec);
    int heightMode = MeasureSpec.getMode(heightMeasureSpec);
    int heightSize = MeasureSpec.getSize(heightMeasureSpec);

    int width, height;

    if (widthMode == MeasureSpec.EXACTLY) {
        // 确切的宽度
        width = widthSize;
    } else if (widthMode == MeasureSpec.AT_MOST) {
        // 宽度不超过所需尺寸
        width = Math.min(desiredWidth, widthSize);
    } else {
        // 未指定宽度
        width = desiredWidth;
    }

    if (heightMode == MeasureSpec.EXACTLY) {
        // 确切的高度
        height = heightSize;
    } else if (heightMode == MeasureSpec.AT_MOST) {
        // 高度不超过所需尺寸
        height = Math.min(desiredHeight, heightSize);
    } else {
        // 未指定高度
        height = desiredHeight;
    }

    setMeasuredDimension(width, height);
}

其中莫得还有第三种标志位:UNSPECIFIED 它表示,你自己看着办,把你最理想的大小告诉我,我考虑考虑

三、自定义View

3.1 什么是自定义View

自定义View是Android开发中的重要概念,允许你创建不同于标准UI组件的用户界面元素。这些自定义View可以是各种形状、颜色和交互方式,完全满足你的设计需求。

3.2 创建自定义View

步骤1: 继承View类或其子类

要创建自定义View,首先需要继承自Android的View类或其子类,如ViewGroup。根据需要,你还可以继承更具体的子类,如TextViewImageView等实现自定义控件。以下是一个简单的示例:

public class MyCustomView extends View {
    public MyCustomView(Context context) {
        super(context);
    }
}

步骤2: 重写onMeasure方法

你需要重写onMeasure方法来定义自定义View的尺寸。这个方法决定了View的宽度和高度,通常基于View的内容和布局需求计算测量值。如上2.2代码

步骤3: 重写onDraw方法

onDraw方法用于绘制自定义View的内容。在这里,你可以使用Canvas对象进行绘制操作,包括绘制形状、文本、位图等。

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    // 绘制自定义UI
    Paint paint = new Paint();
    paint.setColor(Color.RED);
    canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
}

步骤4: 在XML布局中使用自定义View

步骤5: 在Java代码中操作自定义View

3.3 优化方向

3.3.1 使用硬件加速

3.3.2 避免不必要的绘制

3.3.3 使用合适的绘制方法 drawPath,drawBitmap

3.3.4 处理触摸事件:如果需要自定义View响应触摸事件,可以重写onTouchEvent方法,处理触摸事件逻辑。

3.3.5 多线程优化


                

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/366465.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据探索与可视化:可视化分析数据-下

目录 一、前言 二、介绍 Ⅰ.时间序列数据 Ⅱ.文本数据 Ⅲ.社交网络数据 三、结语 一、前言 那么本篇将互怼其他类型的数据分析的可视化方法进行介绍,它们分别是:时间序列,文本数据,社交网络数据。 二、介绍 Ⅰ.时间序列数据 import pan…

【python接口自动化】- 正则用例参数化

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

鸿蒙开发有必要学吗?看完这篇再决定吧

在科技的潮流中,每一次新操作系统的诞生都是对旧秩序的挑战与新机遇的孕育。鸿蒙操作系统的出现,无疑是近年来科技界最引人注目的事件之一。自华为于2019年正式推出鸿蒙系统以来,这一我们自主研发的操作系统不仅在国内引起巨大反响&#xff0…

在windows平台上mysql的安装教程

1.下载 mysql下载网址:https://dev.mysql.com/downloads/installer/ 这里直接选择的是mysql的社区版。自己使用直接选择免费的就行 直接选择下载 2.安装过程 选择Server only 就行 下一步 下一步 下一步,选择弱密码把,方便学习和自己使用 设置…

Java对象属性设置方式

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 对象属性设置方式 直接赋值 SystemMappingCode systemMappingCode new SystemMappingCode();systemMappingCode.setCodeResp(request.getCodeResp());systemMapping…

POI操作word表格,添加单元格,单元格对齐方法(不必合并单元格)

添加单元格,直接对row进行create新的cell,则会导致新创建的单元格与前面的单元格不对齐的现象。 //表格信息XWPFTable table doc.createTable();table.setWidth("100%");//第一行XWPFTableRow row0table.getRow(0);XWPFTableCell cell00row0.…

基于Python的招聘网站爬虫及可视化的设计与实现

摘要:现在,随着互联网网络的飞速发展,人们获取信息的最重要来源也由报纸、电视转变为了互联网。互联网的广泛应用使网络的数据量呈指数增长,让人们得到了更新、更完整的海量信息的同时,也使得人们在提取自己最想要的信…

Linux - iptables 防火墙

一. 安全技术和防火墙 1.安全技术 入侵检测系统(Intrusion Detection Systems):特点是不阻断任何网络访问,量化、定位来自内外网络的威胁情况,主要以提供报警和事后监督为主,提供有针对性的指导措施和安全…

【C++游戏开发-01】推箱子

C游戏开发 文章目录 C游戏开发[TOC](文章目录) 前言一、逻辑分析1.1地图实现1.2人物的移动1.2.1小人移动1.2.2其他移动 1.3墙壁的碰撞1.4箱子的推动1.4.1什么时候推箱子1.4.2什么情况可以推箱子 1.5胜利的判断1.6卡关的处理1.7关卡的切换 二、DEMO代码2.1游戏框架2.2各功能函数…

【亲测有效】无法获得下列许可 SOLIDWORKS Standard 无效的(不一致的) 使用许可号码 (-8,544,0)

在观看本文章前,请注意看你的报错代码是否和我的一致,如果不是,直接跳过本文章。 前言:我安装的是SOLIDWORKS2022版,软件已经安装完毕,SolidWorks_Flexnet_Server文件夹里面的两个注册表已经安装完毕&#…

Python tkinter (7) ——Scale控件

Python的标准Tk GUI工具包的接口 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 Python tkinter (5) 选项按钮与复选框 Pyt…

Stata收敛性分析(含详细代码说明和样例数据)

Stata收敛性分析(含详细代码说明和样例数据) 收敛性分析是管理科学和运筹学中重要的概念,是一种解决决策者对他们的管理策略的反馈的方式和手段。它的最终目的是帮助管理者从复杂的环境中筛选最优的解决方案。收敛性分析一般情况下会结合一些…

为客户解决痛点,电子纸增加制表功能

为客户解决痛点,电子纸增加制表功能 部分客户购买我们的电子纸后反馈效果很好,但是在配套组态软件制作电子纸模板时,遇到需要制作表格的时候比较麻烦。像是在画板作画一样,比较费时,而且效果不是很好,没办…

用VsCode写python

1.创建一个文件夹 2.创建.py文件 print("Hello World") print("*"*10) 4.运行 在终端版本fileName python3 app.py

MATLAB矩阵的操作(第二部分)

师从清风 矩阵的创建方法 在MATLAB中,矩阵的创建方法主要有三种,分别是:直接输入法、函数创建法和导入本地文件中的数据。 直接输入法 输入矩阵时要以中括号“[ ]”作为标识符号,矩阵的所有元素必须都在中括号内。 矩阵的同行元…

零基础学Python之核心基础知识

1.Python入门简介 (1)什么是Python Life is short, you need Python!人生苦短,我用Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性,相比其他语言…

笔记---中国剩余定理

全程学自y总 AcWing.204.表达整数的奇怪方式 给定 2 n 2n 2n 个整数 a a a1, a a a2,…, a a an 和 m m m1, m m m2,…, m m mn,求一个最小的非负整数 x x x,满足 ∀ i ∈ [ 1 , n ] , x ≡ m ∀i∈[1,n],x≡m ∀i∈[1,n],x≡mi ( m o d a (mod a (…

SpringMVC中的文件上传与下载功能,以及虚拟目录的配置

目录 文件下载 文件上传 第一步:添加依赖: 第二步:在SpringMVC的配置文件中添加配置: 三、控制器方法: 虚拟目录配置方式: 前端代码 SpringMVC中的文件上传与下载功能是通过MultipartResolver来实现…

华为鸿蒙DevEco Studio编辑器初体验

目录 前言DevEco Studio编辑器使用准备工作应用/服务运行可视化调试DevEco Studio配置参数列表番外篇:参加鸿蒙生态学堂创新实训营北京站的培训结束语 前言 众所周知华为鸿蒙作为移动应用开发的第三个热门领域(前两个热门领域iOS原生、Android原生都已…

半桥式三相无刷直流电动机不同导通角的性能的变化

半桥式三相无刷直流电动机不同导通角的性能的变化 syms Omega clear clcOmega0pi/180*120 for Omega_x[pi/180*120,pi/180*130,pi/180*140,pi/180*150,pi/180*160,pi/180*170,pi/180*180]Omega_x*180/piOmega_x_0 (4*sin(Omega_x/2)/(Omega_xsin(Omega_x)))/(4*sin(Omega0/2)/…