安卓开发工程师-自定义 View
1. 如何创建一个简单的自定义 View?
创建自定义 View 的基本步骤如下:
- 继承 View 或其子类:自定义 View 可以继承自
View
或其他更具体的视图类(如ImageView
、Button
等)。 - 重写构造方法:通常需要重写三个构造方法,以支持代码和 XML 的使用。
- 重写
onDraw
方法:用于绘制视图的内容。 - 重写
onMeasure
方法:用于测量视图的大小。
以下是一个简单的自定义 View 示例:
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;public class SimpleCustomView extends View {private Paint paint;public SimpleCustomView(Context context) {super(context);init();}public SimpleCustomView(Context context, AttributeSet attrs) {super(context, attrs);init();}public SimpleCustomView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init() {paint = new Paint();paint.setColor(0xFF4CAF50); // 设置画笔颜色}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 绘制一个矩形canvas.drawRect(50, 50, 200, 200, paint);}
}
在布局文件中使用自定义 View:
<com.example.SimpleCustomViewandroid:layout_width="wrap_content"android:layout_height="wrap_content" />
2. 自定义 View 的测量(onMeasure)过程是如何工作的?
onMeasure
方法用于测量视图的大小。Android 系统会调用此方法来确定视图的宽度和高度。自定义 View 需要根据需求重写此方法。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int width = 300; // 自定义宽度int height = 300; // 自定义高度setMeasuredDimension(width, height); // 设置测量结果
}
widthMeasureSpec
和 heightMeasureSpec
是父视图传递给子视图的测量规格,包含测量模式和大小。常见的测量模式有:
MeasureSpec.EXACTLY
:精确值(如match_parent
或具体数值)。MeasureSpec.AT_MOST
:最大值(如wrap_content
)。MeasureSpec.UNSPECIFIED
:未指定。
3. 如何在自定义 View 中绘制图形和文本?
在自定义 View 中,可以通过重写 onDraw
方法来绘制图形和文本。Canvas
类提供了丰富的绘图方法。
@Override
protected void onDraw(Canvas canvas) {super.onDraw(canvas);// 绘制矩形paint.setColor(0xFF4CAF50);canvas.drawRect(50, 50, 200, 200, paint);// 绘制圆形paint.setColor(0xFF2196F3);canvas.drawCircle(300, 200, 100, paint);// 绘制文本paint.setColor(0xFF000000);paint.setTextSize(40);canvas.drawText("Hello, Custom View!", 50, 400, paint);
}
4. 如何处理自定义 View 的触摸事件?
可以通过重写 onTouchEvent
方法来处理触摸事件。MotionEvent
类提供了事件类型(如按下、移动、抬起)和触摸坐标。
@Override
public boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:// 按下事件break;case MotionEvent.ACTION_MOVE:// 移动事件break;case MotionEvent.ACTION_UP:// 抬起事件break;}return true; // 表示事件已被处理
}
5. 如何实现自定义 View 的动画效果?
可以通过 ValueAnimator
或 ObjectAnimator
来实现动画效果。以下是一个简单的平移动画示例:
import android.animation.ValueAnimator;public class SimpleCustomView extends View {private float translationX = 0;public SimpleCustomView(Context context) {super(context);init();}private void init() {// 启动动画ValueAnimator animator = ValueAnimator.ofFloat(0, 300);animator.setDuration(1000); // 动画时长animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {translationX = (float) animation.getAnimatedValue();invalidate(); // 触发重绘}});animator.start();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.translate(translationX, 0); // 根据动画值平移canvas.drawRect(50, 50, 200, 200, paint);}
}
6. 如何优化自定义 View 的性能,避免过度绘制?
- 减少无效绘制区域:通过
invalidate(Rect)
只重绘需要更新的区域。 - 避免在
onDraw
中创建对象:将对象创建移到构造方法或onSizeChanged
中。 - 使用硬件加速:确保视图启用了硬件加速。
- 减少层次嵌套:减少不必要的视图嵌套,降低绘制复杂度。
7. 如何在自定义 View 中使用属性动画?
属性动画可以通过 ObjectAnimator
或 ValueAnimator
来实现。以下是一个旋转动画的示例:
import android.animation.ObjectAnimator;public class SimpleCustomView extends View {public SimpleCustomView(Context context) {super(context);init();}private void init() {// 旋转动画ObjectAnimator animator = ObjectAnimator.ofFloat(this, "rotation", 0, 360);animator.setDuration(1000); // 动画时长animator.start();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawRect(50, 50, 200, 200, paint);}
}
8. 如何实现自定义 View 的布局参数(LayoutParams)?
可以通过继承 ViewGroup.LayoutParams
或 ViewGroup.MarginLayoutParams
来实现自定义布局参数。
public class CustomViewLayoutParams extends ViewGroup.MarginLayoutParams {public int customProperty;public CustomViewLayoutParams(Context c, AttributeSet attrs) {super(c, attrs);TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.CustomViewLayoutParams);customProperty = a.getInt(R.styleable.CustomViewLayoutParams_customProperty, 0);a.recycle();}public CustomViewLayoutParams(int width, int height) {super(width, height);}
}
在布局文件中使用:
<com.example.CustomViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"app:customProperty="10" />
9. 如何通过自定义 View 实现复杂的交互逻辑?
可以通过监听事件、维护状态和更新视图来实现复杂的交互逻辑。例如,实现一个简单的拖拽效果:
private float lastX, lastY;@Override
public boolean onTouchEvent(MotionEvent event) {float x = event.getX();float y = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:lastX = x;lastY = y;break;case MotionEvent.ACTION_MOVE:float dx = x - lastX;float dy = y - lastY;translationX += dx;translationY += dy;invalidate();lastX = x;lastY = y;break;}return true;
}
10. 如何调试自定义 View 的问题?
- 日志输出:通过
Log
类输出调试信息。 - 布局边界:在开发者选项中开启“显示布局边界”,查看视图的绘制边界。
- 性能分析:使用 Android Profiler 分析绘制性能。
- 断点调试:在 IDE 中设置断点,逐步调试代码。
相关文章:
安卓开发工程师-自定义 View
1. 如何创建一个简单的自定义 View? 创建自定义 View 的基本步骤如下: 继承 View 或其子类:自定义 View 可以继承自 View 或其他更具体的视图类(如 ImageView、Button 等)。重写构造方法:通常需要重写三个…...
Vue中权限控制的方案
文章目录 源码:一、页面级1.1、路由守卫1.2、动态路由 二、按钮级别2.1、通过v-if来判断2.2、通过组件包裹的方式来判断2.3、通过自定义指令的方式 三、接口级别 源码: https://gitee.com/liu-qiang-yyds/sysPermission 一、页面级 1.1、路由守卫 前端…...
磁盘分析工具合集:告别C盘焦虑!
今天李师傅带大家盘点五款硬盘空间分析利器,帮你精准定位那些"吃空间"的元凶,让C盘告别臃肿烦恼! 一、WizTree 这款NTFS磁盘的"透视眼"堪称效率典范。它通过直接读取硬盘主文件表(MFT)实现秒级扫描,1TB机械…...
硬件学习之器件篇-蜂鸣器
根据工作原理的不同,可以分为电磁式蜂鸣器和压电式蜂鸣器。 1、电磁式蜂鸣器 电磁式蜂鸣器根据内部是否有震荡源,又可以分为有源电磁式蜂鸣器和无源电磁式蜂鸣器。 1.1 外观区别 有源电磁式蜂鸣器从底部看是,是黑胶密封的。 无源电磁式蜂…...
紫檀博物馆一游与软件开发
今天去逛了中国紫檀博物馆,里边很多层展品,也有一些清代的古物,檀木,黄花梨木家具和各种摆件,馆主陈丽华女士也是发心复原、保留和弘扬中国的传统文化,和西游记唐僧扮演者迟成瑞先生一家。 每一件展品都精…...
Cribl 新建Datatype
Cribl 数据dataset 有个很重要的就是datatype, 下面来新建一下: 先看一下原来的datatype : 再点击Add Datatype: Rule...
开源 LLM 应用开发平台 Dify 全栈部署指南(Docker Compose 方案)
开源 LLM 应用开发平台 Dify 全栈部署指南(Docker Compose 方案) 一、部署环境要求与前置检查 1.1 硬件最低配置 组件要求CPU双核及以上内存4GB 及以上磁盘空间20GB 可用空间 1.2 系统兼容性验证 ✅ 官方支持系统: Ubuntu 20.04/22.04 L…...
医药档案区块链系统
1. 医生用户模块 目标用户:医护人员 核心功能: 检索档案:通过关键词或筛选条件快速定位患者健康档案。请求授权:向个人用户发起档案访问权限申请,需经对方确认。查看档案…...
Redis常见命令
(一)常见命令① 一、数据结构 二、通用命令 ①KEYS查询语句 pattern代表模板,有点像匹配表达式(不是正则),是redis的一种内置表达式,可以在里面使用通配符 底层存在一种模糊查询机制,效率并不高。当redis的数据量达到一定规模时(数百万上千万甚至更多),使用这种模糊查询机制会…...
Qt的window注册表读写以及删除
Qt的window注册表读写以及删除 1. 使用 QSettings(Qt推荐方式)基本操作关键点限制 2. 调用Windows原生API示例:创建/读取键值常用API注意事项 3. 高级场景(1) 递归删除键(2) 注册表权限修改 4. 安全性建议总结其他QT文章推荐 在Qt中操作Windo…...
纯css实现环形进度条
需要在中实现一个定制化的环形进度条,最终效果如图: 使用代码 <divclass"circular-progress":style"{--progress: nextProgress,--color: endSliderColor,--size: isFull ? 60rpx : 90rpx,}"><div class"inner-conte…...
20250405周赛-S
链接 A. 日历 我的: #include<bits/stdc.h> using namespace std; int n,d[105],ans; bool check(int x,int y){if(x<10){if(y<10){return xy;}else{return xy%10&&xy/10;}}else{if(y<10){return yx%10&&yx/10;}else{return y/10…...
某碰瓷国赛美赛,号称第三赛事的数模竞赛
首先我非常不能理解的就是怎么好意思自称第三赛事的呢?下面我们进行一个简单讨论,当然这里不对国赛和美赛进行讨论。首先我们来明确一点,比赛的含金量由什么来定?这个可能大家的评价指标可能不唯一,我通过DeepSeek选取…...
希象传屏下载
2025年4月5日,11~22℃ 免费软件,功能:手机、个人笔记本和智慧黑板可以双向控制。要求在同一网络下或者同一WiFi下。 目的:自己下载的时候比较方便。 1、希沃易官网 2、如何下载? 被投屏:接收端࿱…...
解决 PDF 难题:批量处理、文档清理与自由拆分合并
软件介绍 在日常办公与学习中,处理 PDF 文件常常让人头疼不已,不过别担心,今天有一款堪称神器的国产老牌 PDF 工具要分享给大家。它就是 PDF 补丁丁,凭借其强大功能,为大家排忧解难。 界面体验 初次打开 PDF 补丁丁&…...
SQL Server 2022 数据同步到 Elasticsearch 思考
公司的老项目了,采用的是sqlserver 2022作为数据卡做的,但是产品对接客户,发现对搜索的要求很高,尤其是全文检索,考虑到ES采用倒排所以效率上的优势和整体开发的成本,大佬们商量之后,果断的采用…...
基于Spark的哔哩哔哩舆情数据分析系统
【Spark】基于Spark的哔哩哔哩舆情数据分析系统 (完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 本项目基于Python和Django框架进行开发,为了便于广大用户针对舆情进行个性化分析处…...
分布式事务解决方案全解析:从经典模式到现代实践
前言 在分布式系统中,数据一致性是一个核心问题。随着微服务架构的普及,跨服务、跨数据库的操作变得越来越普遍,如何保证这些操作的原子性、一致性、隔离性和持久性(ACID)成为了一个极具挑战性的任务。本文将全面介绍…...
迈向未来:数字化工厂管理如何重塑生产力
迈向未来:数字化工厂管理如何重塑生产力 随着工业4.0的浪潮席卷全球,“数字化工厂管理”成为制造业转型的关键一步。从传统生产模式到数据驱动的智能制造,企业在追求生产效率、质量与灵活性方面实现了飞跃式发展。然而,实施数字化管理不仅仅是技术问题,更关乎流程优化、数…...
LeetCode 1863.找出所有子集的异或总和再求和
题解 根据上述图可以根据二进制运算获取所有的子集,但是可以使用二进制获取所有子集需要有题目的这一句话才能够使用注意:在本题中,元素相同的不同子集应多次计数。 也就是对于{2,2,3,4,5}的子集不会简化成{2,3,4,5} public static int sub…...
蓝桥云客---蓝桥速算
3.蓝桥速算【算法赛】 - 蓝桥云课 问题描述 蓝桥杯大赛最近新增了一项娱乐比赛——口算大赛,目的是测试选手的口算能力。 比赛规则如下: 初始给定一个长度为 N 的数组 A,其中第 i 个数字为 Ai。随后数组会被隐藏,并进行 Q 次…...
Kafka 概念
🌀 Kafka 是什么? Kafka 是一个分布式流处理平台,可以用来: 🚚 高效地收集、传输、存储、处理 实时数据流。 它最初由 LinkedIn 开发,用于解决海量日志处理的问题,后来开源给 Apache࿰…...
双向链表增删改查的模拟实现
本章目标 0.双向链表的基本结构 1.双向链表的初始化 2.头插尾插 3.头删尾删 4.查找与打印 5.在指定位置之前插入数据/在指定位置之后插入数据 6.在指定位置之前删除数据/在指定位置之后删除数据 7.销毁链表 0.双向链表的基本结构 本章所实现的双向链表是双向循环带头链表,是…...
配置ASP.NET Core+NLog配置日志示例
以下是一个精简且实用的 NLog 配置文件示例,适用于 ASP.NET Core 项目,包含文件日志、控制台日志和自动归档功能: NLog.config 示例 (保存到项目根目录) xml Copy Code <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http:…...
Roo Code使用MCP服务(大模型上下文协议)
MCP概念火爆,但是理解起来有点难度,使用起来也有点难度。 启用MCP RooCode直接支持使用MCP服务,甚至可以帮助写MCP,为我们提供了很大的方便。单击 Roo Code 窗格顶部导航栏中的类似三个插座的图标,显示如下MCP的配置…...
【项目管理】第一部分 信息技术 1/2
相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 概要 知识点: 现代化基础设施、数字经济、工业互联网、车联网、智能制造、智慧城市、数字政府、5G、常用数据库类型、数据仓库、信息安全、网络安全态势感知、物联网、大数…...
《UNIX网络编程卷1:套接字联网API》第6章 IO复用:select和poll函数
《UNIX网络编程卷1:套接字联网API》第6章 I/O复用:select和poll函数 6.1 I/O复用的核心价值与适用场景 I/O复用是高并发网络编程的基石,允许单个进程/线程同时监控多个文件描述符(套接字)的状态变化,从而高…...
Three.js 系列专题 1:入门与基础
什么是 Three.js? Three.js 是一个基于 WebGL 的 JavaScript 库,它简化了 3D 图形编程,让开发者无需深入了解底层 WebGL API 就能创建复杂的 3D 场景。它广泛应用于网页游戏、可视化、虚拟现实等领域。 学习目标 理解 Three.js 的核心组件:场景(Scene)、相机(Camera)…...
Qt框架深度解析:核心技术、应用场景与实战指南
Qt(发音同“cute”)是一个跨平台的C应用程序开发框架,广泛用于开发图形用户界面(GUI)程序,但也支持非GUI的后台服务、命令行工具等。它由挪威的Trolltech公司于1995年推出,后由诺基亚、Digia等公…...
低代码开发平台:飞帆中的控件中转区
低代码开发平台:飞帆中的控件中转区的作用 当控件因为尺寸太大难以拖到 div 框中时,可以先拖到控件中转区中,此时控件会变成一个标签,然后将这个标签拖到 div 框中即可。 飞帆 fvi.cn...
基于STM32的智能门禁系统设计与实现
一、项目背景与功能概述 在物联网技术快速发展的今天,传统门锁正在向智能化方向演进。本系统基于STM32F103C8T6微控制器,整合多种外设模块,实现了一个具备以下核心功能的智能门禁系统: 密码输入与验证(4x3矩阵键盘&a…...
maven项目打包jar给其他项目pom外部引用
maven项目打包jar给其他项目pom外部引用 在现实开发过程中,很多代码需要被重复利用的,但是代码量又是很多,这样的代码可以提出出来作为公共代码或者叫做工具使用,通常这样的工具会以jar包的形式被其他项目pom引入使用。第一步 创…...
Linux线程
一、线程的使用 线程创建 函数原型及头文件 #include <pthread.h> int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg); 参数: tidp:当pthread_create成功…...
Keepalive+LVS+Nginx+NFS高可用项目
项目架构 分析 主机规划 主机系统安装应用网络IPclientredhat 9.5无NAT172.25.250.115/24lvs-masterrocky 9.5ipvsadm,keepalivedNAT172.25.250.116/24 VIP 172.25.250.100/32lvs-backuprocky 9.5ipvsadm,keepalivedNAT172.25.250.117/24 VIP 172.25.2…...
在线编辑数学公式
参考工具: https://www.processon.com/mathtype https://www.latexlive.com/ 一、简单好用的数学公式编辑工具推荐 1. MathType / AxMath • 特点:专业公式编辑软件,支持与Word、WPS等办公软件无缝集成,提供丰富的数学符号和模…...
【spring Cloud Netflix】OpenFeign组件
1.概述 Feign旨在使编写Java Http客户端变得更容易。前面在使用RibbonRestTemplate进行服务的远程调用 时,利用RestTemplate对Http请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由 于对服务的依赖调用可不止一处࿰…...
基于Flask的Windows命令大全Web应用技术解析与架构设计
基于Flask的Windows命令大全Web应用技术解析与架构设计 引言 Windows命令行工具是系统管理和开发调试的核心技能之一。然而,许多用户对常用命令的用法和场景并不熟悉。本文通过一个基于Flask框架开发的Web应用,系统性地整理了50个Windows命令的用法&…...
Qt中左侧项目菜单中构建设置功能中的构建步骤是怎么回事
在 Qt Creator 中,**构建设置(Build Settings)下的构建步骤(Build Steps)**是控制项目如何编译、链接和生成最终产物的核心配置区域。它允许你自定义编译过程中的各个阶段(如 qmake、make、cmake 等命令的具…...
(一)从零开始:用 LangChain 和 ZhipuAI 搭建简单对话
最近一直在研究如何用 LangChain 和 ZhipuAI 搭建一个智能对话系统,发现这个组合真的非常强大,而且实现起来并不复杂。今天就来分享一下我的学习过程和一些心得体会,希望能帮到同样在探索这个领域的小伙伴们。 一、 环境搭建:从零…...
Java大厂面试题 -- JVM 优化进阶之路:从原理到实战的深度剖析(2)
最近佳作推荐: Java大厂面试题 – 深度揭秘 JVM 优化:六道面试题与行业巨头实战解析(1)(New) 开源架构与人工智能的融合:开启技术新纪元(New) 开源架构的自动化测试策略优…...
C++ 标准库参考手册深度解析
C 标准库参考手册是每个 C 开发者的必备工具。本文将系统性解析其架构设计、核心功能及实战应用技巧,帮助开发者构建高效的知识检索与代码开发工作流,涵盖从语法查询到编译器适配的全流程技术细节。 一、网站架构与技术细节 1. 信息组织体系 1.1 层级化…...
单片机学习笔记8.定时器
IAP15W4K58S4定时/计数器结构工作原理 定时器工作方式控制寄存器TMOD 不能进行位寻址,只能对整个寄存器进行赋值 寄存器地址D7D6D5D4D3D2D1D0复位值TMOD89HGATEC/(T低电平有效)M1M0GATEC/(T低电平有效)M1M000000000B D0-D3为T0控制,D4-D7为T1控制 GAT…...
神经网络入门:生动解读机器学习的“神经元”
神经网络作为机器学习中的核心算法之一,其灵感来源于生物神经系统。在本文中,我们将带领大家手把手学习神经网络的基本原理、结构和训练过程,并通过详细的 Python 代码实例让理论与实践紧密结合。无论你是编程新手还是机器学习爱好者…...
2025-04-05 吴恩达机器学习5——逻辑回归(2):过拟合与正则化
文章目录 1 过拟合1.1 过拟合问题1.2 解决过拟合 2 正则化2.1 正则化代价函数2.2 线性回归的正则化2.3 逻辑回归的正则化 1 过拟合 1.1 过拟合问题 欠拟合(Underfitting) 模型过于简单,无法捕捉数据中的模式,导致训练误差和测试误…...
美团滑块 分析
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向过程 距离识别不准简单学习一下&…...
C++ atomic 原子操作
一、原子操作简介 在多线程编程中,通常我们需要多个线程共享数据。但如果不加以控制,多个线程同时访问同一数据,可能会导致数据不一致或竞争条件(race conditions)。为了解决这个问题,我们引入了 原子操作…...
Leetcode - 双周赛153
目录 一、3498. 字符串的反转度二、3499. 操作后最大活跃区段数 I三、3500. 将数组分割为子数组的最小代价四、3501. 操作后最大活跃区段数 II 一、3498. 字符串的反转度 题目连接 本题直接模拟,代码如下: class Solution {public int reverseDegree(…...
25.4 GLM-4+RAG智能标注实战:标注成本暴降60%,检索准确率飙升40%!
使用 GLM-4 优化 RAG 程序:智能标注提升检索质量 关键词:GLM-4 数据标注, RAG 优化, 检索增强生成, 向量数据库, 语义关联度分析 1. RAG 数据标注的核心挑战 在检索增强生成(Retrieval-Augmented Generation)系统中,检索数据的标注质量直接影响最终生成效果。传统标注方…...
基于sklearn实现文本摘要思考
和各位小伙伴分享一下使用sklearn进行文本摘要的思考。 第一版本 原理 提取式文本摘要的基本原理是: 将文本分割成句子 计算每个句子的重要性(权重) 选择权重最高的几个句子组成摘要 常用的句子权重计算方法: TF-IDF:基于词频-逆文档频…...
Cortex-M3 NVIC可以控制异常向量表的哪些部分
Cortex-M3 的 NVIC(嵌套向量中断控制器)不直接控制整个异常向量表,但可以管理向量表中与中断相关的部分行为。以下是 NVIC 对异常向量表的具体控制范围和相关机制: 1. NVIC 直接控制的部分 NVIC 主要管理 外部中断(IRQ) 和部分 系统异常 的行为,但对向量表本身的存储位…...