07-自定义view-绘制
坐标轴
尺寸单位
- 一律为像素
api
Canvas
画布
1 | drawLine |
Path
1 | addRect |
通过canvas.drawPath
将path绘制
绘制方向
1 | path.setFillType |
1 | public enum FillType { |
作用
判断一个点是否在图形内部
从该点向任意方向发射射线,路径上所有相交而非相切的位置中,若从左侧穿过射线,cnt++,右侧穿过,cnt–。若使用WINDING,最终cnt为0,则是在外部,否则在内部;若使用EVEN_ODD,最终cnt为奇数,点在内部,为偶数,点在外部
如果使用WINDING,需要两个图形相减的操作,则将两个图形的绘制方向设为相反的,这样相交部分的点就被认为在图形外部,而不会被涂色。
如果使用EVEN_ODD,需要两个图形相减的操作,不需要处理其绘制方向
View.onSizeChanged
每次layout尺寸改变时会调用
PathMeasure
测量一个path,
1 | getLength // 整个图像的周长 |
用处
比如要做一个仪表盘,在某个位置画刻度,需要总长度计算刻度的间隔
misc
- java里也有类似kotlin的init{},只要在类中直接使用
{}
即可
1 | class XXX { |
- BitmapFactry.Options
- options.inJustDecodeBounds, 只获取长宽,不加在资源
- Xfermode
- 是一种图像混合模式
paint
画笔,定义绘制时的各种特性
1 | setPathEffect // 使用一个path作为绘制的效果 |
dp2px
1 | TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip, Resources.getSystem().displayMetrics) |
注意这里通过getSystem获取的Resources是无法获取应用中定义的colors,strings等资源的
官方文档对其的描述是:
Return a global shared Resources object that provides access to only system resources (no application resources), is not configured for the current screen (can not use dimension units, does not change based on orientation, etc), and is not affected by Runtime Resource Overlay.