从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) 删掉,因为它的默认实现是空。

CXL Virtual Hierarchy (VH) Enumeration理解 在 CXL 3.0 协议中,CXL Virtual Hierarchy (VH) Enumeration 是一种针对 CXL 虚拟层级(Virtual Hierarchy) 设计的设备枚举机制,它允许软件将物理连接的 CXL 设备抽象为多个逻辑层级(虚拟层级),从而实现更灵活的资源管理和拓扑扩展。与传统的 PCIe 枚举相比,CXL VH 枚举在协议特性、拓扑抽象和资源分配机制上有显著差异。本质:VH 是一个逻辑上的设备层级结构,可能与物理连接拓扑不同。 阅读详情

相关推荐

基于CANopenNode协议栈在正点原子探索者开发板上进行移植

配置好之后进行采用keil IDE进行代码生成即可,还需要进行CANopenNode的代码集成,并参照demo进行代码移植。发送完成后心跳包以1s的周期重新开始发送。正点原子的开发板引出的是CAN1接口。这里的心跳时间间隔设置为100ms。则将心跳包周期设置为0。

wangfandashe的博客 4697

Android使用TextureView拍照记录

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

qq_41716992的博客 2243

Python邮件自动化实战:基于imaplib和email库的高效邮件管理方案

本文详细介绍了如何使用Python的imaplib和email库实现高效邮件自动化管理。通过实战案例展示自动收取、解析邮件、下载附件等核心功能,帮助开发者快速构建企业级邮件处理系统,大幅提升工作效率。特别适合需要处理大量邮件的金融、数据分析等场景。

weixin_30500105的博客 618

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

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

whjk20的专栏 332

一文讲清CAN和CANFD的区别

本文将从技术原理、协议特性到应用场景,深度解析两者的核心差异。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 3209

Mac OS X 工具技巧:一文搞定个性化命令行窗口(iTerm2 + zsh + oh-my-zsh 配置Powerline风格)

本不想写这篇文章的,因为在Linux下已经配置过很多次,想着mac应该找篇文章一次就搞定了,结果还是踩坑,看了很多文章,不是某一点没不清楚,就是截图有问题或者命令有问题,官网又难得找等等……花了3个多小时才搞定,所以,还是来总结一篇文章就能够搞定的教程。 为什么要用zsh?用了这么多年的bash,不能说bash不好,不过当我用了zsh后发现,什么叫更好用。 配置过程稍微有点繁琐,但是你看过效果...

mickjoust的技术小屋 1万+

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

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

相忘于江湖 452

自学PCB思路 | PCB设计零基础入门-小白适用(附详细入门经验分享)

本人大一在实践课上就听说PCB,被虎的一楞一楞的,不过现在回看,发现其实并没有相信的那么难!想着把自己这一路摸索的学习路线分享一下,当时我是一边摸索一边上手,一把鼻涕一把泪的过来的。如果你想搞硬件或者需要搞硬件,下面是我的入门学习过程,希望可以帮到你。目录前言选择一款设计软件好的入门课程掌握抄板元件采购焊板子烙铁头热风枪自己半设计明确设计需求全设计最后我并非什么大佬,也没法自己去教大家如何画板。

自动化小秋葵的博客 1万+

Android开发之自定义View

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

weixin_43858011的博客 1万+

(保姆式教程:从下数据到画图)python如何利用EOF分析SSTA海温异常现象并画图

保姆式教程,教你如何利用python分析1979-2004年的太平洋地区的海温异常SSTA,并且绘制出空间模态和时间序列的图片。

shayuxing的博客 2万+

别再买错磁铁了!手把手教你为TLE5012B/AS5047等磁编码器选配和安装径向充磁磁铁

本文详细解析了为TLE5012B/AS5047等磁编码器选配和安装径向充磁磁铁的关键要点。从充磁方向的物理本质到供应商沟通技巧,再到安装工艺的黄金法则,帮助工程师避免常见错误,确保磁编码器稳定工作。特别强调了径向充磁的重要性及验证方法,并提供了尺寸选择、温度特性和抗干扰设计的实用建议。

weixin_26750481的博客 315

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

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

ADwenwen的博客 1万+

大模型部署指南:LM Studio

本文介绍使用LM Studio部署大模型

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 1951

深入理解Android之自定义View

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

Fighting_初心的博客 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

安卓View理解总结

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

gzy19805026167的博客 2562

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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、付费专栏及课程。

余额充值