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/11/3 13:09:29 阅读更多 →
LLM推理优化:从穷举搜索到瓶颈定向的智能体驱动方法

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

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

2026/10/30 4:56:48 阅读更多 →
智能体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/11/2 6:56:00 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/4 1:35:24 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/3 10:57:27 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/3 11:35:49 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/4 6:23:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/3 10:47:27 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/4 19:19:54 阅读更多 →

日新闻

周新闻

月新闻