从view的绘制流程到自定义view

自定义view和高级UI

布局 onMeasure onSizeChanged onLayout
绘制 ondraw Drawable paint canvas path line matrix animation
交互 dispatchEvent 嵌套滑动 (Ne… )

android view 绘制机制和加载过程,请详细说下整个流程

  1. 首先视图是从顶层向子视图遍历的,因为根布局被尺寸确定
  2. setContentView、setImageView、setText这些方法,都需要考虑是否触发requestLayout和invalidate
  3. 视图ViewRootImpl遍历的入口peformTraversals,依次执行测量performMeasure()、布局performLayout、绘制performDraw()
  4. 重写onMeasure 先度量孩子再度量自己,layoutPagram转成MeasureSpec
    MeasureSpec 含义:view的静态内部类, 32位int值 高两位mode ,低30位表示size

1)计算传给孩子的测量规则getChildMeasureSpec:由父mode/parentsize、父padding和孩子layoutpagram按照表格3x3计算的
2)把计算后的规则通过child.measure()传递,
3)获取child.getMeasuredWidth 获取测量值以便计算

5.整体视图测量结束是在页面可见onResume,可以拿到真实宽高
6.Layout布局开放onLayout,视图可选实现,试图组是抽象方法,必须实现,首先计算四个点计算摆放位置,递归结束
7.draw :从底层往上层绘制,从背景,自己内容(开放ondraw),子视图(dispatchDraw),装饰

设置view树重新绘制–只是ondraw 重新调用
invidate()整个view刷新
invalidate(int l,int t,int r,int b)
invalidate(Rect dirt)

附视图绘制的高级用法:

Paint 高级:setshader 设置着色器、渲染 设置绘制路径时的路径效果 setPathEffect(PathEffect effect)
canvas 高级用法

cavas.drawPoint//画点
cavas.drawLine//线
new Path();
path.moveTo(x,y);
path.lineToo(x,y);
path.lineTo(x,y);
path.lineTo(x,y);
path.close;
canvas.drawPath(path,mPaint);//画线

工具类pathparseframework/base/core/java/android/util/ 把json转成path对象
坐标:surface(不会改变),绘图坐标系可设置,向下向右为正、图层:状态栈、layer栈、Drawable是封装的canvas实现
path 高级:贝塞尔曲线 :QQ气泡拖动连接的曲线
pathMeasure 测量path、长,截取片段,获取某点的切线:矩阵控制图片绕着pathmeasure路径上运行

视图动画样式固定,帧动画也有局限性;
属性动画通过(包装器和差值器)不断改变对象属性,最后调用requestLayout、invalidate,进行视图绘制
举例:值动画 ValueAnimator 类,通过差值器,根据值的范围,如 100 ( 100 次),不断地更新调用 onAnimationUpdate ()监听,不断地修改视图的布局宽度,不断地
重绘视图,从而达到动画的效果;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值