从0到1Android自定义View(二)分类和核心函数

android自定义view之卡片式轮播图 前言 Android View体系是界面编程的核心,他的重要性不亚于Android四大组件。能够熟练的编写符合需求自定义VIEW是一个android程序员进阶的重要标志,在很多的企业招聘中都会在任职需求中提到熟练于创建自定义view这项技能,可见能够随心所欲的编写自定义view的重要性。 准备工作 要开启自定义VIEW编写,需要学习的东西有很多,我会在后面一一介绍,但是我不会每一 阅读详情

Android.jpg

前言

这篇主要还是介绍一些知识点,包括上一篇的知识点在内,我们都是需要理解,只有这样,才能更好的制作更多酷炫的自定义 View 。当然每一篇文章都会越来越深入,一步一个台阶,慢慢攀登。

目录

从0到1Android自定义View(二) 分类和核心函数.png

一、自定义 View 分类

常见的 Android 自定义 View 主要有两种类型:

1、组合控件

通过 Android 的基础控件(TextView、ImageView、Button、ProgressBar 等)组合而成,比如下拉刷新、瀑布流控件、带左/右滑功能的控件、视频控件等,这种自定义View的难点在于程序的逻辑处理

2、完全自定义控件

继承自 View、TextureView 或 SurfaceView ,然后重写核心的回调方法,以View 为例,按需复写其构造、onMeasure、onLayout、onTouchEvent、onDraw、onAttachedToWindow、onDetachedFromWindow 等方法,这种自定义 View 的难点在于程序的设计、效率优化和排版,比如输入法中的手写控件、图文混排控件(现在很多都是通过webview加载网页实现了)、个性化进度条、弹幕显示控件、Markdown控件、IDE代码编辑控件等

注意:

我们需要合理的使用自定义 View ,千万不能滥用,不要动不动就自定义 View ,基础控件能完成的工能,千万别自定义 View,因为基础空间 Android,本身就有性能优化的,自定义 View 的价值在于做到基础控件无法做到的效果,为应用的表现增色;,将公用的交互效果提取成自定义控件,方便复用,减少不必要的重复劳动。

二、自定义 View 核心知识点

这部分主要是介绍自定义 View 的核心知识点,上面提到过,完全自定义 View 通常是继承 View ,TextureView,SurfaceView,所以先来了解下这三者之间的区别所在。

1、 View、SurfaceView、TextureView 的区别

View

普通的 View,与宿主窗口共享同一个绘图表面,UI 在主线程中绘制,在有无硬件加速的情况下都能工作(没有硬件加速的情况下,canvas 的有些方法会失效)

SurfaceView

继承自 View,绘制和显示效率高,因为拥有独立的绘图表面,UI 在一个独立的线程中进行绘制,不会占用主线程的资源。SurfaceView 的使用和普通的 View 不一样,需要结合 SurfaceHodler 一起使用。因为和宿主窗口不是共享同一个绘图表面的原因,对其做动画操作可能会得不到想要的效果

TextureView

继承自 View,与 SurfaceView 相比,TextureView 不会创建一个单独的绘图表面,这使得它可以像一般的 View 一样执行一些变换操作,比如移动、动画等等,但 TextureView 必须在硬件加速开启的窗口中才能正常工作;

2、 几个重要的函数
最后通过自定义 View 的流程图来了解一下自定义 View 几个重要的函数。

自定义view的流程图.jpg

(1)构造函数

构造函数是View的入口,可以用于初始化一些的内容,和获取自定义属性

View的构造函数有四种重载

自定义View的构造函数.png

从上面的图也可以看出,自定 View 的构造函数的参数最多有四个,而且有四个参数的构造函数只能在 API 21 以上使用,因此四个参数的构造函数先不考虑,不过我们也需要了解这四个参数具体代表什么?

Context: View 中随处都会用到
AttributeSet: XML 属性(从 XML inflate 的时候使用)
int defStyleAttr: 应用到 View 的默认风格(定义在主题中)
int defStyleRes: 如果没有使用 defStyleAttr,应用到 View 的默认风格

那么这里就有个问题了,有四种构造函数,我们该怎么选择呢?

比如上面图片显示的自定义的 MyView ,继承 View 对象,如果我们想在普通的代码中新建一个 MyView,可以直接使用一个参数的构造函数,这也是大多数选择使用的。

一个参数的构造函数.png

那么两个参数的构造函数什么时候使用呢?比如有时候在 xml 中添加一个自定义 View ,并且加了一些布局属性,宽高属性以及 margin 属性,这些属性会存放在第二个构造函数的 AttributeSet 参数里。

两个参数的构造函数.png

有三个参数的构造函数比第二个构造函数多了一个 int 型的值,名字叫 defStyleAttr ,从名称上判断,这是一个关于自定义属性的参数。第三个构造函数不会被系统默认调用,而是需要我们自己去显式调用,比如在第二个构造函数里调用调用第三个函数,并将第三个参数设为0 。defStyleAttr 指定的是在Theme style 定义的一个 attr,它的类型是 reference 主要生效在 obtainStyledAttributes 方法里,obtainStyledAttributes 方法有四个参数,第三个参数是 defStyleAttr ,第四个参数是自己指定的一个 style ,当且仅当 defStyleAttr 为 0 或者在 Theme 中找不到 defStyleAttr 指定的属性时,第四个参数才会生效,这些指的都是默认属性,当在 xml 里面定义的,就以在 xml 文件里指定的为准,所以优先级大概是:xml>style>defStyleAttr>defStyleRes>Theme 指定,当defStyleAttr 为 0 时,就跳过 defStyleAttr 指定的 reference ,所以一般用 0 就能满足一些基本开发。

(2)onMeasure(测量 View 大小)

这个函数有什么用呢?将这个问题转化一下,就是问为什么要测量 View 的大小呢?

因为 View 的大小不仅由自身所决定,同时也会受到父控件的影响,为了我们的控件能更好的适应各种情况,一般会自己进行测量

onMeasure.png

MeasureSpce 的 mode 有三种:EXACTLY, AT_MOST,UNSPECIFIED,除去 UNSPECIFIED 不谈,其他两种 mode:

当父布局是 EXACTLY 时,子控件确定大小或者 match_parent,mode 都是 EXACTLY,子控件是 wrap_content 时,mode 为 AT_MOST;

当父布局是 AT_MOST 时,子控件确定大小,mode 为 EXACTLY,子控件 wrap_content 或者 match_parent 时,mode 为 AT_MOST。

所以在确定控件大小时,需要判断 MeasureSpec 的 mode,不能直接用 MeasureSpec 的 size。在进行一些逻辑处理以后,调用 setMeasureDimension() 方法,将测量得到的宽高传进去供 layout 使用。

onMeasure流程.png

在实际运用之中只需要记住有测量模式有三种,用 MeasureSpec 的 getSize是获取数值, getMode是获取模式即可。如果对 View 的宽高进行修改了,不要调用 super.onMeasure( widthMeasureSpec, heightMeasureSpec); 要调用 setMeasuredDimension( widthsize, heightsize); 这个函数。

(3)onSizeChanged(确定 View 大小)

那么这个函数又是什么时候调用呢?

这个函数在视图大小发生改变时调用。

那么问题又来了,上面的 onMeasure 函数中不是说对 View 的宽高进行了修改后,要调用 setMeasuredDimension 吗?调用这个方法后,View 的大小基本已经确定了啊,View 的视图大小还会发生变化吗?这是因为 View 的大小不仅仅只是由其本身来决定的,也受它的父控件影响,所以在确定 View 大小的时候最好使用系统提供的 onSizeChanged 回调函数。

onSizeChanged.png

(4)onLayout(确定子 View 布局位置)

确定布局的函数是 onLayout ,它用于确定子 View 的位置,在自定义 ViewGroup 中会用到,他调用的是子 View 的 layout 函数。比如,有时候我们自定义 View 的时候,需要获取 View 的一些信息就需要用到这个函数。当然,如果是单纯的 View 就没与必要重写这个方法,为什么这么说呢?

因为单纯的 View ,不是一个 View 容器,没有子 View ,而 onLayout 方法里主要是具体摆放子View 的位置,水平摆放或者垂直摆放,所以在单纯的自定义 View 是不需要重写 onLayout 方法。不过需要注意的一点是,子 View 的 margin 属性是否生效就要看 parent 是否在自身的 onLayout 方法进行处理,而 View 的 padding 属性是在 onDraw 方法中生效的

(5)onDraw(绘制内容)

重头戏,onDraw,也就是是实际绘制的部分。

onDraw.png

一般自定义控件耗费心思最多的就是这个方法了,需要在这个方法里,用 Paint 在 Canvas 上画出你想要的图案。如果是直接继承的 View,那么在重写 onDraw 的方法是时候完全可以把 super.ondraw(canvas) 删掉,因为它的默认实现是空。

从URDF到仿真动画:基于Simulink、Simscape与S-Function的机械臂一体化建模与控制 本文详细介绍了从URDF文件到高保真仿真动画的一体化机械臂建模与控制流程。通过整合Simulink、Simscape与S-Function,构建了包含物理特性的虚拟机械臂模型,并实现了自适应滑模等高级控制算法的嵌入与验证。该流程打通了从机械设计到控制算法验证的闭环,为机器人开发提供了高效的仿真平台。 阅读详情

相关推荐

揭秘Outlook/QQ邮箱伪造:如何利用Unicode编码绕过SPF检测

本文深入剖析了利用Unicode编码进行邮件显示名伪造的攻击手法,揭示了攻击者如何通过插入零宽字符等特殊编码绕过SPF检测,使邮件在Outlook、QQ邮箱等客户端中看似来自可信发件人。文章通过Python代码示例演示了伪造过程,并提供了从用户自查到管理员部署DMARC策略的多层次防御建议。

weixin_29063035的博客 334

Android使用TextureView拍照记录

使用TextureView设置人脸框,拍人脸照片

qq_41716992的博客 2243

CCD成像原理以及机器视觉中的相机选型

CCD成像原理以及机器视觉中的相机选型 近年来,随着人工智能的高速发展和图像处理技术的日益成熟,机器视觉在自动化领域发挥着越来越大的作用。机器视觉被用于代替人工视觉,使机器人能够完成以往只有人工才能完成的任务,这大大减少了在危险环境下工作的风险。同时,在来料无序或工作环境杂乱的情况下,机器视觉可以显著提高生产效率和自动化柔性程度。随着人们对工业设计水平和生产效率需求的日益提高,机器视觉正在逐步代替传统复杂繁琐的自动化模式,成为当今的主要发展趋势。 机器视觉是一项综合的技术,包括数字图像处理,传感器,光学

cszn6666的博客 5572

Android 自定义View 学习笔记(含问题记录)

View(ViewGroup) 的绘制过程: 1. 度量: onMeasure --------测量大小 相当于装修房子测量房子的面积(包括各个房间的面积, 不能超过总面积) 2 . 布局: onLayout (measureSpec, 布局参数LayoutParams, 布局加载LayoutInflater) 相当于设计每个房间、位置摆放什么 3. 绘制: onDraw 相当于最终的装饰 因为ViewGroup 是树形结构,会递归调用其孩子的这三个方法, 完成最终的绘制。 ...

whjk20的专栏 332

【RandLA-Net实战】从零构建隧道点云数据集并训练大场景语义分割模型

本文详细介绍了如何使用RandLA-Net构建隧道点云数据集并进行大场景语义分割模型训练。从数据采集、标注到模型训练与优化,提供了完整的实战指南,特别针对隧道场景的特殊挑战提出了解决方案。通过实际案例展示了RandLA-Net在处理大场景点云数据时的高效性和准确性,为隧道巡检等工程应用提供了可靠的技术支持。

weixin_30485379的博客 113

RTX 4060笔记本也能跑!保姆级教程:用Ollama在Windows上部署DeepSeek-R1-8B模型

本文详细介绍了如何在RTX 4060笔记本上通过Ollama本地部署DeepSeek-R1-8B模型,提供从环境配置到性能调优的全流程优化指南。针对笔记本用户的显存、散热等问题,给出了量化模型选择、启动参数优化及散热解决方案,帮助用户在消费级硬件上高效运行大语言模型。

weixin_28745067的博客 525

Android自定义View(二)View的事件分发机制

View的事件分发机制是Android中的一个难点,也是非常重要的知识点,充分理解和掌握事件分发机制有助于我们在自定义View的过程中更好地设计和解决事件相关问题。下面我们通过源码的角度去分析一下Android是怎么处理View事件分发的 假如我们从Activity这个层面开始接收事件,事件的大致传递顺序是Activity->Window->View,即先从activity的disp...

相忘于江湖 452

南 京 农 业 大 学 试 题 纸 附表(rape.csv)是25个油菜材料,测得每个材料的千粒重、亚油酸等的含量. (1) 对物质含量的八个指标作主成分分析,画出碎石图和主成分得分图; (2) 选

(1)请用n1

Mrrunsen的博客 498

Android开发之自定义View

在自定义View的时候,需要两个构造函数。否则在编译的时候会报异常:Binary XML file line Error inflating class. 原因是:Android在根据xml文件夹创建View对象的时候会调用View的双参构造方法,即public SquareView(Context context, AttributeSetattrs),所以如果没有写全的话就会报错。...

weixin_43858011的博客 1万+

openclaw本地模型对接

使用是官方推荐的一种集成方式,它可以简化配置过程。但由于您的系统环境和之前复杂的配置历史,我为您梳理了一个核心流程,并增加了关键的“事后检查”步骤,以确保能从根本上解决问题。

suny8的专栏 2460

【DaVinci Developer专题】-28-Client Server Port Interface中useArgumentType、useArrayBaseType和useVoid介绍

共7页 目录 1 ImplPolicy = useArgumentType 2 ImplPolicy = useArrayBaseType 3 ImplPolicy = useVoid 4 三者代码差异部分 5 结尾 <--返回「实战篇」博文-总目录--> <--返回「Autosar从入门到精通-实战篇」专栏主页--> 关键字: 缩略语/术语 含义 DEV DaVinci Developer

「汽车电子助手」的博客 1502

Pytorch基础函数(二)变形函数——view()与view_as()

view()函数是用于对Tensor(张量)进行形状变化的函数,如一个Tensor的size是3x2,可以通过view()函数将其形状转为2x3。 但是需要注意的是进行操作的张量必须是contiguous()的,即在在内存中连续的。(不连续可以使用tensor.contiguous()操作转为连续)。 一、view()函数基本操作 函数定义:view(*args) [Ps:...

ADwenwen的博客 1万+

R语言dplyr包recode函数、recode_factor函数数值或因子替换实战

R语言dplyr包recode函数、recode_factor函数数值或因子替换实战 目录 R语言dplyr包recode函数、recode_factor函数数值或因子替换实战 #导入dplyr包 #recode函数进行数值替换 #recode_factor函数对因子变量进行替换 #导入dplyr包 install.packages("dplyr") # Install & load dplyr library("dpl.

data+scenario+science+insight 1590

深入理解Android之自定义View

自定义View、多线程、网络,被认为是Android开发者必须牢固掌握的最基础的三大基本功。而自定义View又是Android开发中特别重要的一环,很多地方都需要用到自定义View。这篇文章我就梳理一下自定义View的相关知识。 目录 (一)什么是自定义View (二)自定义组合View (三)自定义View的绘制 1. Canvas.drawXXX() Pa...

Fighting_初心的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

自定义View起步:自定义View分类和构造函数

前言 经过前面三章的内容讲解,我们了解到了自定义View的一下基础知识。从这一篇起我们将介绍自定义View的实际使用中个所需要的具体指示,比如构造方法,属性,布局和测量等各种API。这虽然是基础性的内容,但是知识量复杂庞大。所以我们定义为起步阶段。 Android offers a sophisticated and powerful componentized model for build

cdy的博客 公众号:Android开发吹牛皮 617

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

安卓View理解总结

安卓View理解总结 参考 link.网站写的一篇博客; 一.视图坐标系. View是Android所有控件的基类,同时ViewGroup也是继承自View,下面这张图可以直观了解。 1.Android坐标系. Android中有两种坐标系,分别为Android坐标系和视图坐标系,首先我们先来看看Android坐标系。 在Android中,将屏幕的左上角的顶点作为Android坐标系的原点,这个...

gzy19805026167的博客 2562

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android自定义View以及View的绘制流程

Android自定义View以及View的绘制流程 View类代表用户界面组件的基本构建块;View在屏幕上占据一个矩形区域,并负责绘制和事件处理;View是用于创建交互式用户界面组件(按钮、文本等)的基础类。 ViewGroup是View的子类,是所有布局的父类,是一个可以包含其他View或者ViewGroup并定义它们的布局属性一个看不见的容器。 实现一个自定义View,通常会覆写一些Fram...

weixin_41729259的博客 3404

Android自定义View的用法总结

本文参考了:http://greenrobot.me/devpost/android-custom-layout/ Android SDK中提供了很多UI组件,如RelativeLayout, LinearLayout等,使用自定义控件有两大优点: 1、通过减少View的使用来增加UI的显示效率 2、构建SDK中没有的控件 原文总结了4种自定义View,分别是Compo

bigconvience的专栏 5746

Android自定义View详解,自定义View的实现方法

在Android中,所有的用户界面都是通过View来实现的,它是Android UI框架的核心组件。自定义View是在已有的View的基础上进行扩展和定制,所以在实现自定义View之前,我们首先需要了解View的基本知识。另一种方式是直接创建自定义View类,这样可以更加灵活地控制View的行为和样式。通过自定义View类,可以实现各种独特的用户界面效果和交互方式,比如自定义进度条、翻页效果、拖拽控件等。@Override。

m0_46368082的博客 2217

Android:创建自定义View

Android 框架中定义的所有视图类都会扩展 View。您的自定义视图还可以直接扩展 View,或者您可以通过扩展某个现有视图子类(如 Button)来节省时间。 如需允许 Android Studio 与视图交互,您必须至少提供一个接受 Context 和 AttributeSet 对象作为参数的构造函数。此构造函数允许布局编辑器创建和编辑视图的实例。

ChinaDragon10的博客 1150

浅谈Android自定义View

0. 前言本文将对自定义View的原理和方法进行简要讲解,通过此文,你将学到: 安卓的View架构 View的绘图机制 自定义View的方法步骤 1. View控件的架构1.1 View和ViewGroupAndroid中,控件大致可以分为两大类: View控件 ViewGroup控件 它们都会在界面中占得一块矩形区域。View控件是单个的视图控件,是一个独立的最小个体,View控件之间互不相容,比

吴豪杰 1264

重学Android:自定义View基础(一)

作为一名安卓开发,也被称为大前端,做一个美观的界面,是我们必备的基础技能,可能在开发中我们最常用的是系统自带的View,因为他能满足绝大部分需求,难一点的我们也可以上Github上找个三方库使用,少数情况下会让我们进行自定义View,当然这不代表着我们可以不去掌握其原理,因为它是通往中高级程序员的必经之路,也是大厂面试的热门知识,只有熟练掌握其核心原理,才能让我们在后续的开发中游刃有余。

WriteBug001的博客 1293

Android自定义View入门:RoundedLetterView是什么?1分钟看懂Android 5.0风格字母头像库

**RoundedLetterView** 是一个轻量级的 Android 自定义 View 开源库,它复刻了 **Android 5.0 联系人应用** 中经典的圆形字母头像效果。只需在 XML 里声明一行控件,就能为你的联系人、用户列表或聊天界面快速加上"首字母 + 圆形底色"的头像,支持自定义字母内容、字体大小、文字颜色和背景颜色。 ## 效果长什么样?Android 5.0 联系人字母头

gitblog_00009的博客 906

从0到1Android自定义View(四)贝塞尔曲线

前言 扯来扯去,前面三篇自定义 View 文章,终于扯完了一些知识点,有些枯燥,所以我也是讲下核心点,没有细分析,主要是让各位有点印象和了解。这篇终于是实践,敲代码的了,因为工作原因,这篇拖的比较久,不过这系列会一直更新下去的,会把我工作中用到的自定义 View 也会加上去。好了,回归正原题,说到自定义 View ,似乎都离不开贝塞尔曲线,因此,第一篇实践就是与贝塞尔曲线有关的。 目录一、贝塞尔

GitHubClub 6262

Android自定义View之分类和核心函数

目录 从0到1Android自定义View(二) 分类和核心函数.png 一、自定义 View 分类 常见的 Android 自定义 View 主要有两种类型: 1、组合控件 通过 Android 的基础控件(TextView、ImageView、Button、ProgressBar 等)组合而成,比如下拉刷新、瀑布流控件、带左/右滑功能的控件、视频控件等,这种自定义View的难

luanxuye的博客 435

Carson带你学Android:深入解析自定义View工作流程

今天,我将全面总结自定义View 的全工作流程,我能保证这是市面上的最全面、最清晰、最易懂的

Carson带你学Android 8811
上一篇: Android Studio 代码混淆(你真的会混淆吗)
下一篇: 滴滴出行2017秋招算法笔试题(作弊概率)
Two_Water
博客等级 码龄12年 573粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值