Android开发-视图基础
在Android应用开发中,视图(View)是构建用户界面的基本元素。无论是按钮、文本框还是复杂的自定义控件,它们都是基于View
类或其子类实现的。掌握视图的基础知识对于创建功能强大且美观的应用至关重要。本文将深入探讨Android中的视图概念,包括视图层次结构、常用视图组件以及如何自定义视图等内容。
一、视图简介
在Android中,视图(View)是一个用于绘制用户界面元素的基类。每个视图占据屏幕上的一个矩形区域,并负责绘制自身以及处理事件。所有的UI组件,如TextView
、Button
等,都是直接或间接继承自View
类。
(一)视图与布局
视图通常需要放置在一个容器内,这个容器被称为布局(Layout)。常见的布局有LinearLayout
、RelativeLayout
、ConstraintLayout
等,它们决定了视图之间的相对位置和排列方式。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/text_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello, World!" /></LinearLayout>
二、视图层次结构
视图以树状结构组织,根节点通常是某个布局管理器,而叶子节点则是具体的UI组件。这种层次结构有助于管理和优化渲染过程。
(一)视图组(ViewGroup)
ViewGroup
是View
的一个特殊子类,它可以包含其他视图作为其子节点。通过嵌套不同的ViewGroup
,可以构建复杂的用户界面。
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button 1" /><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button 2" />
</LinearLayout>
三、常用视图组件
Android SDK提供了丰富的内置视图组件,满足大多数应用场景的需求。
(一)TextView
用于显示文本信息,支持多种样式设置,如字体大小、颜色、粗体/斜体等。
<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="这是一个TextView示例"android:textSize="16sp"android:textColor="#0000FF"/>
(二)EditText
允许用户输入文本的编辑框,常用于表单输入场景。
<EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入文本"/>
(三)Button
最常见的交互元素之一,用于触发特定操作。
<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="点击我"/>
(四)ImageView
用于显示图片资源,支持从本地文件或网络加载图片。
<ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/my_image"/>
四、自定义视图
当内置视图无法满足需求时,可以通过继承View
类来自定义视图。
(一)重写onDraw()方法
onDraw()
方法负责视图的具体绘制逻辑,你可以在这里使用Canvas对象进行绘图。
public class CustomView extends View {public CustomView(Context context) {super(context);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Paint paint = new Paint();paint.setColor(Color.RED);canvas.drawCircle(getWidth()/2, getHeight()/2, 100, paint);}
}
(二)处理测量与布局
为了确保自定义视图能够正确地适应父容器,可能还需要重写onMeasure()
和onLayout()
方法。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int desiredWidth = 200;int desiredHeight = 200;int widthMode = MeasureSpec.getMode(widthMeasureSpec);int widthSize = MeasureSpec.getSize(widthMeasureSpec);int heightMode = MeasureSpec.getMode(heightMeasureSpec);int heightSize = MeasureSpec.getSize(heightMeasureSpec);int width;int 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);
}
五、事件处理
视图不仅用于展示信息,还可以响应用户的触摸、点击等交互事件。
(一)监听器模式
为视图添加事件监听器是最常用的事件处理方式。
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(getApplicationContext(), "按钮被点击了", Toast.LENGTH_SHORT).show();}
});
(二)手势检测
对于更复杂的手势识别,可以使用GestureDetector类。
GestureDetector gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {// 处理滑动手势return true;}
});view.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {return gestureDetector.onTouchEvent(event);}
});
六、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!
相关文章:
Android开发-视图基础
在Android应用开发中,视图(View)是构建用户界面的基本元素。无论是按钮、文本框还是复杂的自定义控件,它们都是基于View类或其子类实现的。掌握视图的基础知识对于创建功能强大且美观的应用至关重要。本文将深入探讨Android中的视…...
Prometheus实战教程:k8s平台-Redis监控案例
以下是 Prometheus 自动发现 Redis 实例的完整 YAML 文件示例,适用于生产环境。该配置包括: Redis 部署:运行 Redis 实例。Redis Exporter:用于暴露 Redis 指标。Prometheus 自动发现:通过 Kubernetes 服务发现自动抓…...
Prompt Engineering 提示词工程学习
一、Prompt Engineering 简介 Prompt Engineering 是设计和优化输入提示(Prompt)以获得预期输出的过程。在与大型语言模型(如 GPT-4)交互时,如何构造提示会显著影响模型的回答质量。 二、Prompt 的重要性 提高生成准确性:通过正确的 Prompt 引导,模型能够更好地理解用…...
数造科技携 DataBuilder 亮相安徽科交会,展现“DataOps +AI”双引擎魅力
近日,数造科技受邀参加第三届中国(安徽)科技创新成果转化交易。 作为国内领先的数据开发与治理平台提供商,数造科技携带其核心产品 DataBuilder 精彩亮相 “新一代信息技术展区”,吸引了众多参会者的目光。 关于 DataB…...
Linux/AndroidOS中进程间的通信线程间的同步 - 共享内存
在之前的文章中介绍了允许无关进程共享内存区域以便执行 IPC 的技术:共享文件映射。但他存在一些不足。 使用一个共享文件映射来进行 IPC 要求创建一个磁盘文件,即使无需对共享区域进行持久存储也需要这样做。除此之外,这种技术还会带来一些…...
ES6入门---第三单元 模块七: Proxy的使用+Reflect的使用
proxy: 代理 扩展(增强)对象、方法(函数)一些功能 比如: Vue Vue.config.keyCodes.enter65 Proxy作用: 比如vue中拦截 预警、上报、扩展功能、统计、增强对象等等 proxy是设计模式一种, 代理模式 语法: new Proxy(target, handler); …...
【JAVA】BigDecimal判断是否为0, / by zero的问题修复
bug场景 我要处理一个任务完成率的计算,任务完成率pct 实际值 real / 任务值 task 进入计算前,我需要判断task是否为空,或者为0,防止除法出错。 之前使用了equal方法 if(!task.equals(BigDecimal.ZERO))//开始计算因为刚开始测…...
从 “机器人 +“ 到 “+ 机器人“:算力政策撬动的产业生态革命
在深圳光明科学城的云端算力平台上,数据以每秒千万次的速度流动,这里每年发放的 600 万元算力补贴,正如同催化剂般激活着人形机器人产业的深层变革。当广东将 "算力券" 政策精准嵌入珠三角制造体系,一场从 "单机智…...
如何在24G显存机器上搭建一个超过gpt效果的DeepSeek-R1?
DeepSeek-R1蒸馏模型概述与应用指南  引言 DeepSeek-R1作为一款先进的AI推理模型,在性能上已超越GPT-4o和Claude-3.5等主流开源模型。为满足更广泛应用…...
seamless_communication,facebook推出的开源语音翻译项目
Seamless Communication是由Facebook Research开发的一个开源项目,旨在提供先进的语音和文本翻译功能,支持多国语音。 今天试着来复现下。 1、首先下载代码。 git clone https://github.com/facebookresearch/seamless_communication 2、按照步骤执…...
C++从入门到实战(十二)详细讲解C++如何实现内存管理
C从入门到实战(十二)详细讲解C如何实现内存管理 前言一、C内存管理方式1. new/delete操作内置类型2. 异常与内存管理的联系(简单了解)3. new和delete操作自定义类型 二、 operator new与operator delete函数(重点&…...
console-chat-gpt开源程序是用于 AI Chat API 的 Python CLI
一、软件介绍 文末提供程序和源码下载 console-chat-gpt开源程序是用于 AI Chat API 的 Python CLI,与 AI 模型聊天的终极 CLI 伴侣,直接从命令行享受与 OpenAI、MistralAI、Anthropic、xAI、Google AI、DeepSeek、阿里巴巴、Inception 或 Ollama 托管…...
影刀RPA开发-程序备注说明的必要性
1. 备注指令的调用 1.1 指令搜索 搜索出备注指令后,添加到代码框中 1.2 快捷输入 在代码框中,输入指令关键字,可以快速展示出相关指令 2.备注指令内容设置 备注信息要依据代码执行的功能书写 尽量写明该语句或该段落代码的功能作用 单行…...
第十节:图像处理基础-图像算术运算 (加法、减法、混合)
引言 在计算机视觉领域,图像算术运算是最基础却至关重要的核心技术。无论是实现简单的图片合成、开发智能监控系统,还是构建复杂的医学影像分析工具,加减运算和混合操作都扮演着关键角色。OpenCV作为最流行的计算机视觉库,提供了…...
如何使用UGUI的EventTrigger
前言 在 Unity 的 UGUI 系统中,EventTrigger 是一个强大的组件,允许开发者监听和处理多种 UI 交互事件。以下是详细的使用方法、示例代码、优缺点分析以及注意事项。 一、EventTrigger 基本用法 1. 添加 EventTrigger 组件 在 Unity 编辑器中选中 UI 对象(如 But…...
5G赋能农业物联网:智能化种植的新纪元
5G赋能农业物联网:智能化种植的新纪元 在农业领域,精准化、智能化已成为现代农业发展的方向。而5G的出现,让农业物联网(Agri-IoT)突破了传统的瓶颈,真正实现了实时监测、高效数据传输、智能化决策…...
LeetCode 热题 100 64. 最小路径和
LeetCode 热题 100 | 64. 最小路径和 大家好,今天我们来解决一道经典的动态规划问题——最小路径和。这道题在 LeetCode 上被标记为中等难度,要求找到从网格的左上角到右下角的路径,使得路径上的数字总和为最小。 问题描述 给定一个包含非负…...
精益数据分析(45/126):媒体网站商业模式的深度剖析与挑战应对
精益数据分析(45/126):媒体网站商业模式的深度剖析与挑战应对 在创业和数据分析的领域中,探索不同商业模式的运作机制和关键要点是提升业务能力的重要途径。今天,我们依旧带着共同进步的目标,深入研读《精…...
学习Linux的第四天
今天我们来学习Linux的网络配置,以及链表的知识开个小头 三种网络配置模式 桥接模式(用的最多) 2.Nat模式 3. 仅主机模式(Nat模式的功能外,只能在局域网通信,不能访问外网) 桥接模式…...
AGV导航控制器技术方案——基于EFISH-SBC-RK3576/SAIL-RK3576的国产化革新(新一代工业级自主可控解决方案)
一、方案核心架构 1. 硬件拓扑设计 主控单元:SAIL-RK3576核心板(八核A72A53M0异构架构)传感器层: 双激光雷达(RS-LiDAR-16线 SICK TIM240)9轴IMU(BMI088) 轮式编码器&…...
ISCC 2025练武题 WP部分
总结 垃圾比赛,垃圾题目,纯脑洞题,技术好不好没得关系,就看你脑洞大不大。 web里塞misc,re里塞misc真是牛逼他妈给牛逼开门牛逼到家。 逆天平台,卡的一批,靶机还是公用的,把flag删…...
mysql:什么是一致性视图(Read View)
一致性视图(Read View)是 MVCC(多版本并发控制)中的核心概念,用于实现事务隔离性。 它是一个逻辑概念,让事务在读取数据时看到特定时间点的数据库快照,而不受其他事务并发修改的影响。 一致性…...
android中背压问题面试题及高质量回答范例
🎯 回答的目标是: 表现出你理解背压的本质(不是框架知识,而是系统层面的问题)。 能清晰讲出几种处理背压的方案(理论 实战)。 能结合 Android 场景讲具体例子(比如 UI 线程、网络…...
【C++】C++11(上)
🚀write in front🚀 📜所属专栏: C学习 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对我最大…...
工具分享:通过滑块拉取CAN报文信号数值自动发送报文
0. 概述 CAN报文发送工具使用wxpython进行开发,配套Excel模板可以通过修改Excel自定义界面展示的信号名称和信号的属性;同时,工具支持导入现场采集的报文数据自动按照配套Excel模板定义的报文发送周期进行模拟发送。 由于是我好几年前开发的作品,一些开发细节也记得不是很…...
android 折叠屏开发适配全解析:多窗口、铰链处理与响应式布局
安卓适配折叠屏指南 折叠屏设备为安卓开发带来了新的机遇和挑战。以下是适配折叠屏的关键要点: 1. 屏幕连续性检测 // 检查设备是否支持折叠屏特性 private fun isFoldableDevice(context: Context): Boolean {return context.packageManager.hasSystemFeature(&…...
Cloudera CDP 7.1.3 主机异常关机导致元数据丢失,node不能与CM通信
问题描述 plaintext ERROR Could not load post-deployment data from /var/run/cloudera-scm-agent/process/ccdeploy_hadoop-conf_etchadoopconf.cloudera.yarn_-8903374259073700469 IOError: [Errno 2] No such file or directory: /var/run/cloudera-scm-agent/proce…...
超越 DeepSeek-R1,英伟达新模型登顶
近日,英伟达发布全新开源模型系列 Llama-Nemotron,凭借卓越性能引发业界关注,有望重塑开源 AI 格局。 该系列在推理能力上超越 DeepSeek-R1,内存效率与吞吐量显著提升。其创新采用合成数据监督微调与强化学习训练,全方…...
centos8.5.2111 更换阿里云源
使用前提是服务器可以连接互联网 1、备份现有软件配置文件 cd /etc/yum.repos.d/ mkdir backup mv CentOS-* backup/ 2、下载阿里云的软件配置文件 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo 3、清理并重建…...
阿里云平台与STM32的物联网设计
基于阿里云平台与STM32的物联网设计方案可结合硬件选型、通信协议、云端配置及功能实现等多个维度进行设计。以下是综合多个参考案例的详细设计方案: 一、硬件选型与架构设计 主控芯片选择 STM32系列:推荐使用STM32F103(如STM32F103ZET6、STM…...
ESP32- 开发笔记- 软件开发 6 蓝牙协议栈 1
1 蓝牙 ESP32 是一款支持蓝牙功能的强大微控制器,ESP-IDF (Espressif IoT Development Framework) 提供了完整的蓝牙开发支持。 1.1 蓝牙模式 ESP32 支持两种蓝牙模式,即同时支持经典蓝牙和低功耗蓝牙。 1.1.1 蓝牙经典 (BT/BDR/EDR) 支持传统蓝牙协…...
python爬虫爬取网站图片出现403解决方法【仅供学习使用】
基于CSDN第一篇文章,Python爬虫之入门保姆级教程,学不会我去你家刷厕所。 这篇文章是2021年作者发表的,由于此教程,网站添加了反爬机制,有作者通过添加cookie信息来达到原来的效果,Python爬虫添加Cookies以…...
利用动态数字孪生:Franka Research 3 机械臂在机器人策略评估中的创新实践——基于Real-is-Sim框架的仿真与现实闭环验证
一、前言: 在机器人技术飞速发展的今天,如何高效、准确地评估机器人在现实世界中的操作策略,成为制约机器人技术进一步突破的关键瓶颈。传统方法往往依赖于耗时且成本高昂的真实世界测试,而模拟环境虽能提供便利,却因…...
Spark-Core(RDD行动算子)
一、RDD行动算子 行动算子就是会触发action的算子,触发action的含义就是真正的计算数据。 1、reduce 函数签名: def reduce(f: (T, T) > T): T 函数说明:聚集 RDD 中的所有元素,先聚合分区内数据,再聚合分区间…...
spark转换算子
在 Apache Spark 中,转换算子(Transformation)是用于对 RDD(弹性分布式数据集)进行转换操作的函数。这些操作是惰性的,即在调用转换算子时,Spark 并不会立即执行计算,而是记录下转换…...
hadoop的运行模式
(一)Hadoop的运行模式 hadoop一共有如下三种运行方式: 1. 本地运行。数据存储在linux本地,测试偶尔用一下。我们上一节课使用的就是本地运行模式hadoop100。 2. 伪分布式。在一台机器上模拟出 Hadoop 分布式系统的各个组件&#x…...
力扣——25 K个一组翻转链表
目录 1.题目描述: 2.算法分析: 3.代码展示: 1.题目描述: 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总…...
React Router Vs Vue Router
文章目录 前言✅ React Router vs Vue Router 对比一览🧩 React Router 的底层原理简述① 路由声明与匹配(基于 JSX)② 历史模式管理③ 响应式状态处理④ 路由渲染机制(Outlet) ✅ 总结:原理是否一样&#…...
Spark中RDD算子的介绍
引言 在大数据处理领域,Apache Spark凭借其高效性和灵活性备受青睐。而弹性分布式数据集(Resilient Distributed Datasets,简称RDD)则是Spark的核心数据结构。RDD算子作为操作RDD的关键工具,掌握它们对于充分发挥Spar…...
Vivo 手机官网交互效果实现解析
在现代网页设计中,流畅的滚动交互和精美的视觉效果是提升用户体验的关键。本文将深入解析 Vivo 手机官网 Demo 中的一个核心交互效果 —— 基于滚轮滚动的内容展示系统。这个系统允许用户通过滚动鼠标滚轮来浏览不同的手机镜头配置信息,同时伴随平滑的过…...
powershell批处理——io校验
powershell批处理——io校验 在刷题时,时常回想,OJ平台是如何校验竞赛队员提交的代码的,OJ平台并不看代码,而是使用“黑盒测试”,用测试数据来验证。对于每题,都事先设定了很多组输入数据(data…...
AI——认知建模工具:ACT-R
ACT-R(Adaptive Control of Thought—Rational)是一种用于模拟人类认知过程的计算架构,广泛应用于心理学、认知科学和人工智能研究。它通过模块化的方式模拟记忆、注意力、学习、决策等认知机制。以下是ACT-R的核心概念、安装方法、基础语法及…...
Docker 容器镜像环境的依赖导出
#工作记录 如果我们想获取 Docker 容器中已有镜像的所有的依赖包信息,包括其他可能的系统依赖,用于在其他环境(如 WSL 或 Windows)中重新搭建相同的运行环境。 以下是完整的步骤: 1. 导出 Python 依赖(r…...
[ubuntu]fatal error: Eigen/Core: No such file or directory
确认是否安装了eigen3sudo apt-get install libeigen3-dev 解决 fatal error: Eigen/Core: No such file or directory 如果已经安装,但当调用 eigen 库时,报错:fatal error: Eigen/Core: No such file or directory 这是因为 eigen 库默认…...
《硬件视界》专栏介绍(持续更新ing)
名人说:路漫漫其修远兮,吾将上下而求索。 —— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 ✨ 专栏简介📚 当前专栏目录(持续更新中)&a…...
TypeScript类型挑战-刷题
TypeScript类型挑战 vscode刷题 vscode 插件 热身题 // Test Cases import type { Equal, Expect, NotAny } from "./test-utils";type cases [Expect<NotAny<HelloWorld>>, Expect<Equal<HelloWorld, string>>];// Your Code Here …...
Java后端开发day43--IO流(三)--缓冲流转换流序列化流
(以下内容全部来自上述课程) 缓冲流 1. 字节缓冲流 原理:底层自带了长度为8192的缓冲区提高性能 1.1拷贝文件(一次读写一个字节) //1.创建缓冲流的对象 BufferedInputStream bis new BufferedInputStream(new Fi…...
Nginx性能调优与深度监控
一:Nginx性能调优 1.更改进程数和连接数 (1)进程数 在高并发环境中,需要启动更多的Nginx进程以保证快速响应,用以处理用户的请求,避免造成阻塞。使用psaux命令查看Nginx运行进程的个数。从命令执行结果可…...
【LeetCode】高频 SQL 50题 题解
目录 查询 可回收且低脂的产品 寻找用户推荐人 大的国家 文章浏览 I 无效的推文 连接 使用唯一标识码替换员工ID 产品销售分析 I 进店却未进行过交易的顾客 上升的温度 每台机器的进程平均运行时间 员工奖金 学生们参加各科测试的次数 至少有5名直接下属的经理 …...
基于Qt的app开发第六天
写在前面 博主是一个大一下的计科生,现在正在做C面向对象程序设计的课程设计,具体功能可以看本专栏的第一篇博客。 目前的进度是:配好MySQL驱动->设计完界面->实现各个界面的切换 这一篇博主要初步实现待办板块的功能,即新建…...