android 自定义view 详解(二)
一、View 绘制流程1. View 的绘制流程是什么measure/layout/draw 分别做什么measure测量 View 的宽高从根 View 递归调用measure()→onMeasure()结果存在mMeasuredWidth/Heightlayout确定 View 的位置调用layout()→onLayout()子 View 一般在这里调用child.layout()draw绘制内容调用draw()→ 依次执行drawBackground→onDraw→dispatchDraw→onDrawForeground2. MeasureSpec 是什么三种模式有什么区别模式值含义EXACTLY1精确值如match_parent或具体数值AT_MOST2最大值如wrap_contentUNSPECIFIED0无限制如 ScrollView 中的子 View3. 为什么onMeasure会执行多次父 View 可能多次测量子 View 以确定最终尺寸典型的如RelativeLayout、LinearLayout的权重分配4.getWidth()和getMeasuredWidth()的区别getMeasuredWidth()measure 阶段获取的原始测量值getWidth()layout 阶段确定的最终宽度mRight - mLeft通常两者相等但在某些自定义布局中可能不同二、自定义 View 的分类与选择5. 自定义 View 有哪些实现方式如何选择方式适用场景特点继承 View完全自定义绘制重写onDraw无子 View继承 ViewGroup自定义布局重写onLayout管理子 View 位置继承已有 View扩展功能如继承 TextView 增加新属性继承已有 ViewGroup组合控件如继承 FrameLayout 封装复杂 UI6. 自定义 View 如何支持wrap_content必须在onMeasure中处理AT_MOST模式否则wrap_content效果等同于match_parent示例javaif (widthMode MeasureSpec.AT_MOST) { widthSize desiredWidth; }三、触摸事件分发高频考点7. 事件分发的三个核心方法dispatchTouchEvent分发事件返回 true 表示消费onInterceptTouchEventViewGroup 专属是否拦截事件onTouchEvent处理事件8. 事件传递顺序plainActivity.dispatchTouchEvent → PhoneWindow.DecorView.dispatchTouchEvent → ViewGroup.dispatchTouchEvent → onInterceptTouchEvent返回 true 则拦截调用自己的 onTouchEvent → 不拦截则传给子 View → 子 View 的 dispatchTouchEvent → onTouchEvent9. 如果子 View 不消费事件事件会怎么处理子 View 的onTouchEvent返回 false → 事件回传给父 View 的onTouchEvent如果所有 View 都不消费最终回传给 Activity 的onTouchEvent10.requestDisallowInterceptTouchEvent的作用子 View 调用此方法可以阻止父 View 拦截事件常用于解决 ScrollView 嵌套 RecyclerView 的滑动冲突四、自定义绘制11.onDraw中常用的 Canvas API 有哪些绘制基础图形drawLine、drawRect、drawCircle、drawOval、drawArc绘制文字drawText绘制路径drawPath绘制图片drawBitmap12. Paint 常用属性setColor/setARGB颜色setStrokeWidth描边宽度setStyleFILL填充、STROKE描边、FILL_AND_STROKEsetAntiAlias抗锯齿setTextSize文字大小13. Path 的使用场景绘制贝塞尔曲线、复杂形状moveTo、lineTo、quadTo二阶贝塞尔、cubicTo三阶贝塞尔addArc、addCircle等添加基本图形14.Canvas.save()和Canvas.restore()的作用save()保存当前 Canvas 状态坐标系、裁剪区域等restore()恢复到上一次 save 的状态常用于临时变换坐标系后恢复五、动画15. Android 动画的分类类型实现方式特点补间动画View AnimationAlphaAnimation、TranslateAnimation等只改变视觉效果不改变实际属性属性动画Property AnimationValueAnimator、ObjectAnimator真正改变属性值更灵活帧动画Drawable AnimationAnimationDrawable逐帧播放图片16. 属性动画的原理通过ValueAnimator在时间内计算插值利用反射或setter方法不断更新目标属性底层依赖Choreographer的VSync信号驱动17. 自定义 View 中如何实现属性动画定义属性对应的setter方法使用ObjectAnimator.ofFloat(view, propertyName, values...)或者使用ValueAnimatorAnimatorUpdateListener手动更新六、性能优化18. 自定义 View 有哪些性能优化手段避免在onDraw中创建对象应提前初始化 Paint、Path 等使用clipRect和quickReject减少不必要的绘制区域开启硬件加速setLayerType(View.LAYER_TYPE_HARDWARE, null)使用invalidate(Rect)局部刷新而非全屏刷新避免过度绘制减少重叠区域的绘制次数19. 什么是双缓冲自定义 View 中如何利用双缓冲在内存中先绘制到 Bitmap再一次性绘制到屏幕自定义 View 中可通过setLayerType或手动使用离屏 Bitmap 实现20.invalidate()和requestLayout()的区别invalidate()触发重绘调用onDraw不改变尺寸requestLayout()触发重新测量和布局调用onMeasure→onLayout七、其他细节问题21. 自定义属性attrs如何定义和使用在res/values/attrs.xml中定义declare-styleable在构造方法中通过TypedArray获取属性值记得typedArray.recycle()回收22. 自定义 View 的三个构造方法分别什么时候调用一参代码中new View(context)二参XML 中使用三参XML 中使用 指定 style四参API 21XML 中使用 指定 theme attribute23.postInvalidate()和invalidate()的区别invalidate()必须在 UI 线程调用postInvalidate()内部通过 Handler 投递到 UI 线程可在子线程调用24. 如何解决自定义 View 的内存泄漏及时移除动画监听和 Handler 回调避免在onDraw中创建大量临时对象页面销毁时停止动画八、实战场景题25. 如何实现一个圆形进度条思路继承 View在onDraw中用drawArc绘制背景圆弧和进度圆弧通过属性动画更新进度值调用invalidate重绘26. 如何实现一个可拖拽的 View在onTouchEvent中处理ACTION_DOWN、ACTION_MOVE、ACTION_UPACTION_MOVE时计算偏移量调用layout()或offsetLeftAndRight()更新位置或使用ViewDragHelper更推荐27. 如何实现一个折线图/柱状图计算坐标映射关系使用Path连接数据点考虑边缘 padding、动画过渡效果

相关新闻

2026年8月合同销毁回收方式排行榜:哪种环保?看完这篇再决定

2026年8月合同销毁回收方式排行榜:哪种环保?看完这篇再决定

你手中的那份旧合同,真的要随手丢进垃圾桶吗? 面对信息泄露与环境污染这双重风险的情形下, 合同的终去处较你所想象到的要重要得多。就在当下, 我们开启关于——合同销毁背后所蕴含的资源回收相关故事的探讨。 一、什么是合同销毁?它为什么…

2026/10/1 16:46:50 阅读更多 →
LLM推理优化:从穷举搜索到瓶颈定向的智能体驱动方法

LLM推理优化:从穷举搜索到瓶颈定向的智能体驱动方法

最近在部署和优化大语言模型(LLM)服务时,你是否也遇到过这样的困境:面对海量的硬件配置、模型参数、并行策略和调度算法组合,传统的自动化调优方法(如网格搜索、随机搜索)耗时极长,成…

2026/9/27 5:22:11 阅读更多 →
智能体AI(Agentic AI)学习路径指南

智能体AI(Agentic AI)学习路径指南

目录 1. 引言: 2. 什么是智能体AI? 2.1 自主性程度 2.2 智能体AI的优势 2.3 智能体AI的应用场景 3. 任务分解:识别工作流中的步骤 3.1 分解原则 3.2 分解示例 3.3 形式化表示 4. 智能体AI评估(Evals) 4.1 为…

2026/9/28 4:27:47 阅读更多 →

最新新闻

Linux下用VS Code配置Java开发环境:从JDK到项目调试全流程

Linux下用VS Code配置Java开发环境:从JDK到项目调试全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 16:46:52 阅读更多 →
苍蝇检测数据集:VOC与YOLO双格式标注及YOLOv8训练实战

苍蝇检测数据集:VOC与YOLO双格式标注及YOLOv8训练实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 16:46:52 阅读更多 →
GMSL/FPD-Link相机接入难题,proFRAME采集卡一站式解决

GMSL/FPD-Link相机接入难题,proFRAME采集卡一站式解决

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 16:46:52 阅读更多 →
Pi Agent 代理式 AI 助手实战:从任务规划到工具调用与反思重试

Pi Agent 代理式 AI 助手实战:从任务规划到工具调用与反思重试

1. 从“会聊天”到“能干活”:Pi Agent 到底改变了什么 这两年大家接触的 AI 工具,绝大多数还停留在“你问我答”的阶段。你问它一段代码怎么写,它给你一段示例;你问它一个方案怎么设计,它给你一堆建议。但问题在于&am…

2026/10/1 16:46:52 阅读更多 →
蓝色荧光AF350 NHS酯蛋白标记实操:原理、投料与避坑

蓝色荧光AF350 NHS酯蛋白标记实操:原理、投料与避坑

蓝色荧光这块,Alexa Fluor 350 NHS酯在实验室里的地位有点特殊。它不像AF488、AF647那样随处可见,但在多色标记、FRET探针和紫外激发方案里,恰恰是绕不开的选择。前阵子帮人排查一个蛋白酶活性检测实验,供体一直选不好&#xff0c…

2026/10/1 16:46:52 阅读更多 →
TestableMock实战:告别Mockito痛点,轻松Mock静态、私有与构造方法

TestableMock实战:告别Mockito痛点,轻松Mock静态、私有与构造方法

接手一个老项目的单元测试补写工作,应该不少朋友都经历过。我上周就遇到一个特别头疼的场景:被测的支付Service里,构造函数直接new了一个远程配置中心的Client,而这个Client在测试环境里如果真去连配置中心,要么超时要…

2026/10/1 16:45:52 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →