系列文章目录

一篇文章带你走近Android自定义view


文章目录

  • 系列文章目录
  • 前言
  • 一、为什么要自定义view
  • 二、先看看一个超级简单的自定义view(三个构造函数)
  • 三、了解手机的坐标系
  • 四、使用Canvas画一个折线图(重写onDraw()方法)
  • 五、如何自定义属性,且在view中获取到属性的值(小提,在六中会有案例)
  • 六、绘制图案以及加入设置简单的动画(案例讲解很详细)
  • 七、自定义view的实现分类以及自定义组合控件的案例
  • 八、简单测量以及自定义接口实例来控制动画的更新计算表达式(onMeasure,TypeEvaluator)
  • 九 、通过改变变量的值达到动画效果
  • 十、当界面更新频繁(SurfaceView)
  • 十一、GLSurfaceView(继承自SurfaceView,3D效果)
  • 十二 、关于SVG
  • 十三 、上一个简单github案例
  • 十四 、还没来得及具体写的(关键词)
  • 十五 、两道面试相关八股(根据本人面试大厂整理)
    • 1.View绘制流程
    • 2.View 的事件分发机制

前言

从专科到本科,目前本科大四,已经是学习Android的第四个年头了,本打算积累一下冲23考研,但是最近被大佬洗脑后准备冲一冲22的考研,所以后续出文章的几率会很小,但是在前不久答应粉丝整理一个较为详细的Android自定义view教程,恰巧最近报名被华为选入2021年鸿蒙公开课的学生代表之一,在学校为请假条奔波的路上,所以抽出一下午写一篇文章。(有点小感冒,如发现错误请见谅,感谢指正!!!)。


下文为正文内容,所有链接案例注解都比较详细

一、为什么要自定义view

随着各大产品经理的内卷,Android系统内置的View早已无法满足我们的需求,我们需要针对自己的业务来定制我们需要的view,以达到更好的用户体验感,从而增加用户的黏性。

二、先看看一个超级简单的自定义view(三个构造函数)

需求:一个界面两个跑马灯(在xml中实现)
出现的问题:Textview在xml文件中实现跑马灯,如果有两个跑马灯,则会出现抢焦点的现象,只会跑一个。
解决方式:自定义一个Textview,设置其自动获得焦点: isFocused();
原文链接:一个最最最简单的自定义控件(Textview)

public class MyTextView extends TextView {//在用代码创建的时候调用public MyTextView(Context context) {this(context, null);}//在识别XML的时候会调用此方法创建Textview,底层会用反射去AttribestSet去取属性值public MyTextView(Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);}//给第一个构造函数和第二个使用public MyTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}//解决一个问题,需要Textview天生获取焦点@Overridepublic boolean isFocused() {return true;}
}

从以上代码中,本人已将函数的作用写入到备注中。

三、了解手机的坐标系


具体案例文章:Android用Canvas画一个真正能跑的跑马灯

四、使用Canvas画一个折线图(重写onDraw()方法)

此文章案例主要为canvas.drawLine(),drawText()的简单使用。
具体案例文章:Android用Canvas画一个折线图,并加以简单封装

五、如何自定义属性,且在view中获取到属性的值(小提,在六中会有案例)

以颜色为例。

//attrs文件<attr name="leftcolor" format="reference|color"/><attr name="rightcolor" format="reference|color"/>
//java文件   ---TaiJiView为自定义view名称//获取自定义属性。TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TaiJiView);//获取颜色int  leftcolor = ta.getColor(R.styleable.TaiJiView_leftcolor, Color.BLACK);int  rightcolor=ta.getColor(R.styleable.TaiJiView_rightcolor, Color.WHITE);//回收ta.recycle();
//布局中app:leftcolor="@color/colorPrimary"app:rightcolor="#ff0000"

六、绘制图案以及加入设置简单的动画(案例讲解很详细)

canvas.drawCircle ,旋转动画
具体案例文章:Android自定义view之太极图

七、自定义view的实现分类以及自定义组合控件的案例

  • 自定义组合控件:将多个控件组合成为一个新的控件。(本案例)
  • 继承系统控件:如标题二的案例
  • 继承View:如标题六的案例
  • 继承ViewGroup:继承自LinearLayout等系统控件,在系统控件的基础功能上进行扩展。

具体案例文章:Android自定义view之模仿登录界面文本输入框(华为云APP)

八、简单测量以及自定义接口实例来控制动画的更新计算表达式(onMeasure,TypeEvaluator)

项目源码贴在链接文章末尾
具体案例文章:Android自定义view之围棋动画

九 、通过改变变量的值达到动画效果

Android自定义view之利用drawArc方法实现动态效果
Android自定义view之围棋动画(化繁为简)
Android自定义view之利用PathEffect实现动态效果
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
小提:把绘制点移动到中间。代码看起来会简洁点

十、当界面更新频繁(SurfaceView)

讲讲Android为自定义view提供的SurfaceView

十一、GLSurfaceView(继承自SurfaceView,3D效果)

Android自定义view之3D正方体

如需继续深入还请了解openGL相关内容。

十二 、关于SVG

Android利用SVG实现动画效果

十三 、上一个简单github案例

Android线条等待动画JMWorkProgress(可添加依赖直接使用)

十四 、还没来得及具体写的(关键词)

贝塞尔曲线,事件分发机制。枚举(可在框架中用于确定动画状态)

十五 、两道面试相关八股(根据本人面试大厂整理)

1.View绘制流程

View的绘制是从 ViewRootImplperformTraversals()方法开始,从最顶层的 View(ViewGroup)开始逐层对每个 View进行绘制操作 。

View 绘制中主要流程分为measure,layout, draw 三个阶段。

measure :根据父 view 传递的 MeasureSpec 进行计算大小, 自定义View的过程中都会在onMeasure中进行宽高的测量,这个方法会从父布局中接收两个参数 widthMeasureSpacheightMeasureSpac,所以子布局的宽高大小需要受限于父布局。

layout :根据 measure 子 View 所得到的布局大小和布局参数,将子View放在合适的位置上, 结合源码可知 layout()会将四个位置参数传递给 setOpticalFrame()或者 setFrame(),而 setOpticalFrame()内部会调用 setFrame(),所以最终通过 setFrame()确定 ViewViewGroup中的位置。位置确定完毕会调用 onLayout(l,t,r,b)对子View进行摆放。

draw :把 View 对象绘制到屏幕上。

  • Canvas:画布,不管是文字,图形,图片都要通过画布绘制而成
  • Paint:画笔,可设置颜色,粗细,大小,阴影等等等等,一般配合画布使用
  • Path:路径,用于形成一些不规则图形。
  • Matrix:矩阵,可实现对画布的几何变换。

2.View 的事件分发机制

触摸事件的类型

触摸事件对应的是 MotionEvent 类,事件的类型主要有如下三种:

  • ACTION_DOWN
  • ACTION_MOVE(移动的距离超过一定的阈值会被判定为 ACTION_MOVE 操作)
  • ACTION_UP

View 事件分发本质就是对 MotionEvent 事件分发的过程。即当一个 MotionEvent 发生后,系统将这个点击事件传递到一个具体的 View 上。

事件分发流程

事件分发过程由三个方法共同完成:

dispatchTouchEvent: 方法返回值为 true 表示事件被当前视图消费掉;返回为 super.dispatchTouchEvent 表示继续分发该事件,返回为 false 表示交给父类的 onTouchEvent 处理。

onInterceptTouchEvent: 方法返回值为 true 表示拦截这个事件并交由自身的 onTouchEvent 方法进行消费;返回 false 表示不拦截,需要继续传递给子视图。 如果 return super.onInterceptTouchEvent(ev), 事件拦截分两种情况:

  • 1.如果该View存在子View且点击到了该子View, 则不拦截, 继续分发 给 子 View 处理, 此时相当于 return false。

  • 2.如果该 View 没有子 View 或者有子 View 但是没有点击中子 View(此时 ViewGroup 相当于普通 View), 则交由该 View 的 onTouchEvent 响应,此时相当于 return true。

注意:一般的 LinearLayout、 RelativeLayout、FrameLayout 等 ViewGroup 默认不拦截, 而 ScrollView,ListView 等 ViewGroup 则可能拦截,得看具体情况。

onTouchEvent: 方法返回值为 true 表示当前视图可以处理对应的事件;返回值 为 false 表示当前视图不处理这个事件,它会被传递给父视图的 onTouchEvent 方法进行处理。如果 return super.onTouchEvent(ev),事件处理分为两种情况:

  • 1.如果该 View 是 clickable 或者 longclickable 的,则会返回 true, 表示消费 了该事件, 与返回 true 一样;

  • 2.如果该 View 不是 clickable 或者 longclickable 的,则会返回 false, 表示不 消费该事件,将会向上传递,与返回 false 一样。

注意:在 Android 系统中,拥有事件传递处理能力的类有以下三种:

Activity:拥有分发和消费两个方法。

ViewGroup:拥有分发、拦截和消费三个方法。

View:拥有分发、消费两个方法。

一篇文章带你走近Android自定义view相关推荐

  1. android bitmap转图片_带你用Android自定义View实现网易云音乐宇宙尘埃特效

    作者:Mlx, 链接:https://juejin.im/post/6871049441546567688 前言 前段时间,女朋友用网易云音乐的时候看到一个宇宙尘埃特效,说很好看,想要让我给她开VIP ...

  2. MotionLayout,一篇文章带你了解Android最新的动画布局

    /   今日科技快讯   / 近日,国家市场监管总局网站发布对阿里.腾讯共11张行政处罚决定书.其中,市场监管总局发布对腾讯行政处罚决定书共九张,均为相关股权收购或设立合营企业构成未依法申报违法实施经 ...

  3. android中uvc调用usb摄像头,一篇文章带你了解Android Usb摄像头

    在实际项目中,有些客户可能需要支持usb摄像头功能,如果你也遇到usb摄像头支持的问题,那这篇文章一定能帮助到你. 目前android是支持uvc协议的,也就是只要我们采用的usb摄像头是支持uvc协 ...

  4. Android 自定义view完全解析--带你通透了解自定义view

    参考转自郭霖博客带你一步步深入了解View系列 Android LayoutInflater原理分析 相信接触Android久一点的朋友对于LayoutInflater一定不会陌生,都会知道它主要是用 ...

  5. android 两边圆角,Android自定义View实现带4圆角或者2圆角的效果

    1 问题 实现任意view经过自定义带4圆角或者2圆角的效果 2 原理 1) 实现view 4圆角 我们只需要把左边的图嵌入到右边里面去,最终显示左边的图就行. 2) 实现view上2圆角 我们只需要 ...

  6. [Android]自定义View带效果的滚动数字

    [Android]自定义View带效果的滚动数字 @Author GQ 2016年07月29日 一个可以让数字滚动的View,可以自定义参数,是想要的那种效果! 原文github地址 效果图 Andr ...

  7. 一篇文章带你搞定 SpringBoot 自定义欢迎页和网页图标 favicon

    文章目录 一.SpringBoot 自定义项目启动欢迎页 二.SpringBoot 自定义 favicon 一.SpringBoot 自定义项目启动欢迎页 已经分析过SpringBoot 的资源访问路 ...

  8. android 自定义View绘制电池电量(电池内带数字显示)

    最新公司需要一个电池内带数字的显示电池电量需求,百度了一下.参考下面这篇文章写的Android自定义View之电池电量显示. 增加了里面电池电量数字显示,还有就是一个屏幕适配.不管屏幕分辨率基本都能适 ...

  9. android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...

    转载:http://blog.csdn.net/xiabing082/article/details/48781489 1.  大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...

最新文章

  1. 【怎样写代码】工厂三兄弟之抽象工厂模式(一):问题案例
  2. 柯西不是你 - 杨宗纬
  3. PHP环境配置文件php.ini详解注释 --转贴
  4. 华为云阳云计算外包给哪家公司的_长春作为东北中心,华为四大件已经配齐,绝了!...
  5. Sqlserver中char,nchar,varchar与Nvarchar的区别
  6. html标签默认属性值之margin;padding值
  7. 在Finder标题栏上显示完整路径
  8. 基础知识系列☞关键字→virtual
  9. ISO7637-2瞬态浪涌波形详解
  10. Mac fliqlo 时钟屏保
  11. python背景介绍_二手房房价影响因素分析 讲解1背景介绍
  12. 《管理学》第一章 管理与管理学
  13. 【转】机器学习embedding
  14. 物联网平台面临哪些困境
  15. ORA-00054: 资源正忙 解决办法
  16. table标签的不规则布局
  17. java获取指定格式的年月日时分秒时间
  18. 北京自考毕业论文的各种TIPS
  19. 软考-架构师-第五章-系统性能评价 第二节 性能计算(读书笔记)
  20. SAP MM 事务代码VL04为STO创建外向交货单

热门文章

  1. 剑指offer:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
  2. php word转化为html,php如何把word转换为html(这里使用COM)
  3. 过压保护芯片,高输入电压(OVP)
  4. 五福题材的公众号图文排版有哪些素材?
  5. arduino uno+驱动器控制42步进电机
  6. NEC加入美国国土安全局AIS网络威胁信息官民共享体系
  7. 【论文阅读】PatchmatchNet
  8. html图片水平镜像翻转
  9. 华为HCIE RS笔记-20 OSPF的V-Link
  10. OneDrive登录问题