Android 自定义 View 实现原理

前言

  • 参考一位大神的 自定义 View 系列文章,其中一篇的链接为:
    http://www.gcssloop.com/customview/CoordinateSystem

  • 文章的内容基本是链接的形式,因为大神写的很详细,本人是抱着学习的心态来总结的

  • 内容涉及的是自定义 View 的实现原理,包含贝塞尔曲线、Matrix(矩阵)等

正文

基础部分

1. Android 中的坐标系

因为比较基础,而且有总结的很好的:http://www.gcssloop.com/customview/CoordinateSystem

里边讲的内容大致分三点:

  • 数学中的坐标系与手机屏幕中的坐标系的差别

  • View 的坐标系是相对于父控件而言的

  • MotionEvent 中 get 和 getRaw 的区别

2. 角度和弧度

三方链接http://www.gcssloop.com/customview/AngleAndRadian

  1. 角度和弧度一般会在制作一些复杂炫酷的效果时,会用到相关知识。

  2. 概念 :

  • 角度: 两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆周长的360分之一时,两条射线的夹角的大小为1度.

  • 弧度 :两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆的半径时,两条射线的夹角大小为1弧度.

3. 颜色

三方链接http://www.gcssloop.com/customview/Color

进阶部分

1. 自定义 View 的分类和流程简介

三方链接: http://www.gcssloop.com/customview/CustomViewProcess

image

2. Canvas 之绘制图形

三方链接: http://www.gcssloop.com/customview/Canvas_BasicGraphics

  • 主要介绍了常用的绘制图形,点、矩形、圆、椭圆等

  • 关于画笔 Paint 的一些简要介绍

  • 一个饼状图的案例

Canvas 的常用操作速查表:
image

3. Canvas 之画布操作

三方链接: http://www.gcssloop.com/customview/Canvas_Convert

1. 位移 ( translate )

translate 是坐标系的移动,可以为图形绘制选择一个合适的坐标系。 请注意,位移是基于当前位置移动,而不是每次基于屏幕左上角的 ( 0 , 0 ) 点移动

2. 缩放 ( scale )
1
2
3
public void scale (float sx, float sy)
public final void scale (float sx, float sy, float px, float py)

这两个方法中前两个参数是相同的分别为x轴和y轴的缩放比例。而第二种方法比前一种多了两个参数,用来控制缩放中心位置的,第一种方法表示缩放的中心默认为坐标原点。

  • 缩放是可以叠加的
3. 旋转 ( rotate )
1
2
3
public void rotate (float degrees)
public final void rotate (float degrees, float px, float py)

和缩放一样,第二种方法多出来的两个参数依旧是控制旋转中心点的,默认的旋转中心依旧是坐标原点。

  • 缩放也是可以叠加的
4. 错切 ( skew )
1
public void skew (float sx, float sy)
  • float sx:将画布在 x 轴方向上倾斜相应的角度,sx 为倾斜角度的 tan 值,
  • float sy:将画布在 y 轴方向上倾斜相应的角度,sy 为倾斜角度的 tan 值。
5. 快照 ( save ) 和回滚 ( restore )

image

每调用一次save方法,都会在栈顶添加一条状态信息

4. Canvas 之图片文字

三方链接: http://www.gcssloop.com/customview/Canvas_PictureText

- 绘制图片有两种方法,drawPicture ( 矢量图 ) 和 drawBitmap ( 位图 )
1. drawPicture
  • 使用 Picture 前请关闭硬件加速,以免引起不必要的问题!
1
在 AndroidMenifest 文件中 application 节点下添上 android:hardwareAccelerated=”false” 以关闭整个应用的硬件加速。
  • 可以把 Picture 看作是一个录制 Canvas 操作的录像机。

  • Picture 相关的 API

image

beginRecording 和 endRecording 是成对使用的,一个开始录制,一个是结束录制,两者之间的操作将会存储在 Picture 中。

  • 将 Picture 中的内容绘制出来可以有以下几种方法:

image

2. drawBitmap
  • 获取 Bitmap 的方式:

image

绘制文字
  • 常用 API
1
2
3
4
5
6
7
8
9
10
11
12
13
// 第一类
public void drawText (String text, float x, float y, Paint paint)
public void drawText (String text, int start, int end, float x, float y, Paint paint)
public void drawText (CharSequence text, int start, int end, float x, float y, Paint paint)
public void drawText (char[] text, int index, int count, float x, float y, Paint paint)
// 第二类
public void drawPosText (String text, float[] pos, Paint paint)
public void drawPosText (char[] text, int index, int count, float[] pos, Paint paint)
// 第三类
public void drawTextOnPath (String text, Path path, float hOffset, float vOffset, Paint paint)
public void drawTextOnPath (char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint)

第一类只能指定文本基线位置(基线x默认在字符串左侧,基线y默认在字符串下方)。

第二类可以分别指定每个文字的位置。

第三类是指定一个路径,根据路径绘制文字。

  • 绘制文字也需要画笔 Paint

image

  • 链接中有 API 使用的详细介绍
5. Canvas 之 Path 的基本操作

三方链接: http://www.gcssloop.com/customview/Path_Basic

Path 的作用:
  • 使用 Path 不仅能够绘制简单图形,也可以绘制这些比较复杂的图形。另外,根据路径绘制文本和剪裁画布都会用到Path
6. Path 之贝塞尔曲线

三方链接: http://www.gcssloop.com/customview/Path_Bezier

1. 贝塞尔曲线的作用:

贝塞尔曲线的运用是十分广泛的,可以说贝塞尔曲线奠定了计算机绘图的基础 ( 因为它可以将任何复杂的图形用精确的数学语言进行描述 ) ,在你不经意间就已经使用过它了。

2. 使用实例

image

7. PathMeasure

三方链接: http://www.gcssloop.com/customview/Path_PathMeasure

  • PathMeasure 是一个用来测量 Path 的类,主要有以下方法:
    image
8. 矩阵 Matrix

Matrix 原理: http://www.gcssloop.com/customview/Matrix_Basic

Matrix 详解: http://www.gcssloop.com/customview/Matrix_Method

Matrix Camera : http://www.gcssloop.com/customview/matrix-3d-camera