自定义view基础-最易懂的自定义view原理系列

Carson_Ho Carson_Ho     2022-08-23     416

关键词:

前言

  • 自定义View原理是Android开发者必须了解的基础;
  • 在了解自定义View之前,你需要有一定的知识储备;
  • 本文将全面解析关于自定义View中的所有知识基础。

目录

技术分享


1. View的分类

视图View主要分为两类:

类别 解释 特点
单一视图 即一个View,如TextView 不包含子View
视图组 即多个View组成的ViewGroup,如LinearLayout 包含子View

2. View类简介

  • View类是Android中各种组件的基类,如View是ViewGroup基类
  • View表现为显示在屏幕上的各种视图

    Android中的UI组件都由View、ViewGroup组成。


3. View视图结构

对于多View的视图,结构是树形结构:最顶层是ViewGroup,ViewGroup下可能有多个ViewGroup或View,如下图:

技术分享

一定要记住:无论是measure过程、layout过程还是draw过程,永远都是从View树的根节点开始测量或计算(即从树的顶端开始),一层一层、一个分支一个分支地进行(即树形递归),最终计算整个View树中各个View,最终确定整个View树的相关属性。


4. Android坐标系

Android的坐标系定义为:

  • 屏幕的左上角为坐标原点
  • 向右为x轴增大方向
  • 向下为y轴增大方向

具体如下图:
技术分享

注:区别于一般的数学坐标系

技术分享


5. View位置(坐标)描述

  • View的位置由4个顶点决定的(如下A、B、C、D)

技术分享

4个顶点的位置描述分别由4个值决定:
(请记住:View的位置是相对于父控件而言的

  • Top:子View上边界到父view上边界的距离
  • Left:子View下边距到父View上边界的距离
  • Bottom:子View左边界到父view左边界的距离
  • Right:子View右边界到父view左边界的距离

如下图:
技术分享

个人建议:按顶点位置来记忆:

  • Top:子View左上角距父View顶部的距离;
  • Left:子View左上角距父View左侧的距离;
  • Bottom:子View右下角距父View顶部的距离
  • Right:子View右下角距父View左侧的距离

6. 位置获取方式

  • View的位置是通过view.getxxx()函数进行获取:(以Top为例)
// 获取Top位置
public final int getTop() {  
    return mTop;  
}  

// 其余如下:
  getLeft();      //获取子View左上角距父View左侧的距离
  getBottom();    //获取子View右下角距父View顶部的距离
  getRight();     //获取子View右下角距父View左侧的距离
  • 与MotionEvent中 get()getRaw()的区别
//get() :触摸点相对于其所在组件坐标系的坐标
 event.getX();       
 event.getY();

//getRaw() :触摸点相对于屏幕默认坐标系的坐标
 event.getRawX();    
 event.getRawY();

具体如下图:

技术分享

7. Android的角度(angle)与弧度(radian)

  • 自定义View实际上是将一些简单的形状通过计算,从而组合到一起形成的效果。

    这会涉及到画布的相关操作(旋转)、正余弦函数计算等,即会涉及到角度(angle)与弧度(radian)的相关知识。

  • 角度和弧度都是描述角的一种度量单位,区别如下图::

技术分享

在默认的屏幕坐标系中角度增大方向为顺时针。

技术分享

注:在常见的数学坐标系中角度增大方向为逆时针


8. Android中颜色相关内容

Android中的颜色相关内容包括颜色模式,创建颜色的方式,以及颜色的混合模式等。

8.1 颜色模式

Android支持的颜色模式:

技术分享

以ARGB8888为例介绍颜色定义:

技术分享

8.2 定义颜色的方式

8.2.1 在java中定义颜色

 //java中使用Color类定义颜色
 int color = Color.GRAY;     //灰色

  //Color类是使用ARGB值进行表示
  int color = Color.argb(127, 255, 0, 0);   //半透明红色
  int color = 0xaaff0000;                   //带有透明度的红色

8.2.2 在xml文件中定义颜色

在/res/values/color.xml 文件中如下定义:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    //定义了红色(没有alpha(透明)通道)
    <color name="red">#ff0000</color>
    //定义了蓝色(没有alpha(透明)通道)
    <color name="green">#00ff00</color>
</resources>

在xml文件中以”#“开头定义颜色,后面跟十六进制的值,有如下几种定义方式:

  #f00            //低精度 - 不带透明通道红色
  #af00           //低精度 - 带透明通道红色

  #ff0000         //高精度 - 不带透明通道红色
  #aaff0000       //高精度 - 带透明通道红色

8.3 引用颜色的方式

8.3.1 在java文件中引用xml中定义的颜色:

//方法1
int color = getResources().getColor(R.color.mycolor);

//方法2(API 23及以上)
int color = getColor(R.color.myColor);    

8.3.2 在xml文件(layout或style)中引用或者创建颜色

 <!--在style文件中引用-->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/red</item>
    </style>

 <!--在layout文件中引用在/res/values/color.xml中定义的颜色-->
  android:background="@color/red"     

 <!--在layout文件中创建并使用颜色-->
  android:background="#ff0000"        

8.4 取色工具

  • 颜色都是用RGB值定义的,而我们一般是无法直观的知道自己需要颜色的值,需要借用取色工具直接从图片或者其他地方获取颜色的RGB值。
  • 有时候一些简单的颜色选取就不用去麻烦UI了,开发者自己去选取效率更高
  • 这里,取色工具我强推Markman:一款设计师用于标注的工具,主要用于尺寸标注、字体大小标注、颜色标注,而且使用简单。本人强烈推荐!

技术分享


请帮顶或评论点赞!因为你们的赞同/鼓励是我写作的最大动力!


9. 总结










探究drawable图片的加载原理和缩放规律

自定义View系列教程00–推翻自己和过往,重学自定义View自定义View系列教程01–常用工具介绍自定义View系列教程02–onMeasure源码详尽分析自定义View系列教程03–onLayout源码详尽分析自定义View系列教程04–Draw源码分析及其实践自定... 查看详情

path类的最全面具体解释-自己定义view应用系列

前言自己定义View是Android开发人员必须了解的基础;而Path类的使用在自己定义View绘制中发挥着很关键的数据网上有大量关于自己定义View中Path类的文章。但存在一些问题:内容不全、思路不清晰、简单问题复杂化等等今天。我将... 查看详情

自定义view

  这里是自定义view(二),上一篇关于自定义view的一些基本知识,比如说自定义view的步骤、会涉及到哪些函数以及如何实现自定义属性,同时实现了一个很基础的自定义控件,一个自定义的计时器,需要看的人可以点击这个... 查看详情

android群英传笔记系列三view的自定义:实现一个模拟下载

...本三部分,然后在MainAcitivity中通过线程模拟下载进度。a.定义一个类继承至view,然后添加其构造函数,记得一定要添加含有Attributset参数的构造函数;b.定义和初始化一些数据:privat 查看详情

最简单的自定义viewgroup(代码片段)

...re()在Layout中的onLayout方法中调用子View的layout()再复杂的自定义View都是这样从最简单的形式,不断增加代码,迭代出来的最简单的自定义ViewGroup:publicclassFlowLayoutextendsViewGrouppublicFlowLayout(Contextcontext)this(context,null);publicFlowLayout(Conte... 查看详情

carson带你学android:自定义viewcanvas类使用教程(代码片段)

前言自定义View是Android开发者必须了解的基础;而Canvas类的使用在自定义View绘制中发挥着非常重要的作用网上有大量关于自定义View中Canvas类的文章,但存在一些问题:内容不全、思路不清晰、简单问题复杂化等等今... 查看详情

carson带你学android:手把手教你写一个完整的自定义view

参考技术A自定义View一共分为两大类,具体如下图:对于自定义View的类型介绍及使用场景如下图:在使用自定义View时有很多注意点(坑),希望大家要非常留意:View的内部本身提供了post系列的方法,完全可以替代Handler的作用... 查看详情

android自定义view详解(代码片段)

...开发者来说,原生控件往往无法满足要求,需要开发者自定义一些控件,因此,需要去了解自定义view的实现原理。这样即使碰到需要自定义控件的时候,也可以游刃有余。基础知识自定义View分类自定义View的实现方式有以下几种... 查看详情

自己定义view基础和原理

...系统控件不能满足需求的情况下,往往须要自己开发自己定义View来满足需求,可是该怎样下手呢。本课程将带你进入自己定义View的开发过程,来了解它的一些原理。核心内容:1.编写自己的自己定义View2.增加逻辑线程3.提取和封... 查看详情

我套路的自定义view手势篇

如果你还不了解自定义viewkey看一下这篇基础篇:http://www.cnblogs.com/jaelyn/p/6640671.html加入手势很简单,只要重写onTouchEvent方法就可以获取到手势的信息。@OverridepublicbooleanonTouchEvent(MotionEventevent){returnsuper.onTouchEvent(event);}其中这个返... 查看详情

android自定义view(linebreaklayout-自动换行的标签容器)

...时间更新博客,今天公司的事情忙完得空,继续为我的自定义控件系列博客添砖加瓦。本篇博客讲解的是标签自动换行的布局容器,正好前一阵子有个项目中需要,想了想没什么难度就自己弄了。而自定义控件系列文章中对于自... 查看详情

贝塞尔曲线:原理自定义贝塞尔曲线view使用!!!

 一、原理转自:http://www.2cto.com/kf/201401/275838.htmlAndroid动画学习Demo(3)沿着贝塞尔曲线移动的PropertyAnimationPropertyAnimation中最重要,最基础的一个类就是ValueAnimator了。PropertyAnimation利用ValueAnimator来跟踪记录对象属性已经变化了多... 查看详情

android自定义view基础

有机会拜读启舰老师的自定义view,学习颇多就像平时一样画图需要纸和笔android中Paint类就是画笔,而Canvas类就是纸(画布)所以可以得知笔的属性就是在paint类中设置画出的形状就会在canvas中进行绘制首先实现一个自定义动画–... 查看详情

自定义view系列一自定义view的构造函数,自定义属性(代码片段)

...22/article/details/51147893;本文出自:【梁大盛的博客】自定义View系列一自定义View的构造函数,自定义属性引:自定义View对于Android开发者是一道坎.虽然说是坎但是也得走过去的!此系列文章作为学习自定义View的一系列学习笔记.在... 查看详情

view工作原理(代码片段)

在自定义View的时候,掌握View的底层工作原理,也就是:View的measure、Layout、draw流程,可以帮助我做出比较有意思的自定义View。因此,本文主要讲解:View的工作原理,其中包括:测量流程、布局流... 查看详情

站在源码的肩膀上全解scroller工作机制

...2)—原理剖析Android多分辨率适配框架(3)—使用指南自定义View系列教程00–推翻自己和过往,重学自定义View自定义View系列教程01–常用工具介绍自定义View系列教程02–onMeasure源码详尽分析自定义View系列教程03–onLayout源码详尽... 查看详情

做过的自定义view

做过的自定义Viewandroidviewcustom音频条状图需求详细设计具体实现音频条状图需求音频图最终效果类似于音频图中的条状图只是效果模拟,并不监听真实的音频条的宽度相同,高度随机;条的颜色是红到黄的线性渐变随着时间的... 查看详情

攻克android软键盘的疑难杂症

系列教程:推翻自己和过往,重学自定义View自定义View系列教程01–常用工具介绍自定义View系列教程02–onMeasure源码详尽分析自定义View系列教程03–onLayout源码详尽分析自定义View系列教程04–Draw源码分析及其实践自定义View系列教... 查看详情