Android自定义View学习笔记01

学习内容为gcssloop—自定义view系列

坐标系

Android中屏幕左上角为坐标原点,向下为Y轴正方向,向右为X轴正方向

View的坐标是相对于父控件的

getTop() //View左上角相对于父控件顶部的距离
getLeft() //View左上角相对于父控件右边的距离
getBottom() //View右下角相对于父控件顶部的距离
getRight() //View右下角相对于父控件右边的距离

MotionEvent的get()和getRaw()的区别

get()方法获取的是触摸点相对于控件的位置

getRaw()方法获取的是触摸点相对于屏幕的位置

角度与弧度

角度与弧度的定义

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

角度与弧度的换算

圆一周对应的角度为360度(角度),对应的弧度为2π弧度。

故得等价关系:360(角度) = 2π(弧度) ==> 180(角度) = π(弧度)

换算公式如下

rad是弧度,deg是角度

公式 例子
rad = deg x π / 180 2π = 360 x π / 180
deg = rad x 180 / π 360 = 2π x 180 / π

颜色

Android支持颜色模式

颜色模式 备注
ARGB8888 四通道高精度(32)
ARGB4444 四通道低精度(16)
RGB565 屏幕默认模式(16)
Alpha8 仅有透明通道(8)

字母代表颜色通道,数字代表每个通道用多少位二进制来表示。

当RGB全取最小值(0或0x000000)时颜色为黑色,全取最大值(255或0xffffff)时颜色为白色。

颜色混合模式

默认情况下,当一个颜色绘制到Canvas上时的混合模式是这样计算的:

(RGB通道) 最终颜色 = 绘制的颜色 + (1 - 绘制颜色的透明度) × Canvas上的原有颜色。

用Paint.setXfermode,指定不同的PorterDuff.Mode。下表是各个PorterDuff模式的混合计算公式:(D指原本在Canvas上的内容dst,S指绘制输入的内容src,a指alpha通道,c指RGB各个通道)

混合模式 计算公式
ADD Saturate(S + D)
CLEAR [0, 0]
DARKEN [Sa + Da - SaDa, Sc(1 - Da) + Dc*(1 - Sa) + min(Sc, Dc)]
DST [Da, Dc]
DST_ATOP [Sa, Sa Dc + Sc (1 - Da)]
DST_IN [Sa Da, Sa Dc]
DST_OUT [Da (1 - Sa), Dc (1 - Sa)]
DST_OVER [Sa + (1 - Sa)Da, Rc = Dc + (1 - Da)Sc]
LIGHTEN [Sa + Da - SaDa, Sc(1 - Da) + Dc*(1 - Sa) + max(Sc, Dc)]
MULTIPLY [Sa Da, Sc Dc]
SCREEN [Sa + Da - Sa Da, Sc + Dc - Sc Dc]
SRC [Sa, Sc]
SRC_ATOP [Da, Sc Da + (1 - Sa) Dc]
SRC_IN [Sa Da, Sc Da]
SRC_OUT [Sa (1 - Da), Sc (1 - Da)]
SRC_OVER [Sa + (1 - Sa)Da, Rc = Sc + (1 - Sa)Dc]
XOR [Sa + Da - 2 Sa Da, Sc (1 - Da) + (1 - Sa) Dc]

用示例图来查看使用不同模式时的混合效果如下(src表示输入的图,dst表示原Canvas上的内容):

坚持原创技术分享,您的支持将鼓励我继续创作!