Android 之自定义绘制一

绘制的基本要素

onDraw(Canvas) 绘制方法

Canvas 绘制工具

Paint 调整风格 粗细等

坐标系: x y ,3D 会有z轴,x 左到右,y 上至下,与数学中y颠倒

尺寸单位: 布局中 dp ,sp ,代码中 px;dp 为了适配不同的尺寸

绘制的关键:

draw(Canvas )......(关键类:Paint)

Paint.ANTI_ALIAS_FLAG 抗锯齿 paint.setFlag

像素值和DP转化 TypedValue.applyDimension(TypeValue.COMPLEX_UNIT_DIP,value,rousources.displayMetrics)

rousources.displayMetrics = Resource.getSystem().getDisplayMetric

复制代码
//dp 2 px

val Float.px
    get() = TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP,
        this,
        Resources.getSystem().displayMetrics
    )

抗锯齿原理:修改图形,变得和原始不一样,边缘模糊化,半透明化,看起来视觉上平滑

绘制需要有起点和终点,两点组合

绘制线 : canvas.drawLine 坐标参数 (start x, start y , end x ,end y,paint)

绘制圆: canvas.drawCircle 坐标(cx , cy ,radius,paint)也就是 center x , center y , 半径

draw Path(path,point)

drawArc(left,top,right,bottom,startAngle 起始角度,sweepAngle 划过角度,usecenter 是否连接中心,)

onSizeChange 尺寸改变时调用

path.reset() 重置

path.addCircle(centerx , center y, radius,orition 方向 顺时针Path.Direction.CW和逆时针Path.Direction.CW ); 添加圆----> CW = clockwise ,CCW = counter-clockwise

CW,CCW作用: 配合填充方式判断多个图形方向相交部分填充还是其他

path.addRect 添加矩形()

填充方法:path.setfillType = EVEN_ODD,INVERSE_EVEN_ODD,INVERSE_WINDING,WINDING

INVERSE_EVEN_ODD 是 EVEN_ODD的反规则

INVERSE_WINDING 是 WINDING的反规则

左右 +1 , -1

默认是WINDING填充规则 如果朝一个方向绘制,那么相交的就都属于内部

EVEN_ODD 不管方向如何,每遇到相交点就+1,偶数是外部,基数是内部

ext 贝塞尔曲线

PathMeasure : path准备好之后

复制代码
PathMeasure(path,forceCloseed 是否自动闭合)  
复制代码
pathMeasure.length 获取长度
复制代码
pathMeasure.getPosTan() 路径的长度的切脚

辅助类方法:范围裁剪(clip......())和几何变换(Matrix) View的left / top /right /bottom 的任意一个点或者四个点的变换

还可以重写其他的绘制方法控制覆盖关系

paint:

复制代码
strokeWidth 外线宽度

style 样式 例如 Paint.Style.STROKE

复制代码
setPathEffect(path,advance 提前量 前置量,phase 阶段 空值 )设置pain效果 //  PathDashPathEffect虚线
复制代码
pathEffect会覆盖原先值 用特效画

canvas.translat(dx,dy) 偏移 横向 , 纵向

复制代码
canvas.restore() 恢复

canvas.save() 保存属性

kotlin for 遍历 for((index,value) in list.withIndex) 去角标索引

Kotlin const 常量

相关推荐
冬奇Lab11 小时前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿14 小时前
Android MediaPlayer 笔记
android
Jony_14 小时前
Android 启动优化方案
android
阿巴斯甜15 小时前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇15 小时前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_19 小时前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android
_小马快跑_19 小时前
Kotlin | 从SparseArray、ArrayMap的set操作符看类型检查的不同
android
_小马快跑_19 小时前
Android | 为什么有了ArrayMap还要再设计SparseArray?
android
_小马快跑_19 小时前
Android TextView图标对齐优化:使用LayerList精准控制drawable位置
android
_小马快跑_19 小时前
Kotlin协程并发控制:多线程环境下的顺序执行
android