Canvas
对绘制的辅助:
- 范围裁切:把绘制限制在某个范围内,绘制的内容超出这个范围的就会被裁掉
使用方法:canvas.clipRect()
/canvas.clipPath()
绘制完后需要恢复绘制范围,不然后面的所有绘制全都会被裁切
恢复的方式:在裁切前,调用canvas.save()
保存canvas的状态。在绘制后,调用canvas.restore()
把绘制范围恢复 - 几何变换:
translate()
--平移rotate()
--旋转scale()
--缩放skew()
--错切
几何变换方法是倒序的:先调用的会后执行
几何变换的内部实现使用的是Matrix
类
Matrix.pre/postTranslate()/rotate()/scale()/skew()
Matrix可以定义实现顺序
Matrix可以实现所有的几何变换
使用Camera
类实现3d效果Camera.rotate() / setLocation()
属性动画
不断更新View的属性,让它表现出动画效果
ViewPropertyAnimator
:View.animate().translationX(500)
间隔10ms 默认时长300ms 动画自动开始
- 同时调用多个方法可以同时改变多个属性
- 设置速度模型:
setInterpolator()
AccelerateDecelerateInterpolator
先加速再减速
LinearInterpolator
匀速 - 设置监听器:
setListener(Animator.AnimatorListener)
setUpdateListener(ValueAnimator.AnimatorUpdateListener)
withStartAction(Runnable)
withEndAction(Runnable)
ObjectAnimator
: ObjectAnimator.ofFloat(view, "translationX", 500).start()
根据第二个参数调用相应的setter方法,如:View.setTranslationX()
主动重绘界面:View.invalidate()
setEvaluator(ArgbEvaluator)
自定义 TypeEvaluator
布局过程
首先,界面会从最顶级的根View向下递归地测量出每一级、每一个子View的尺寸和位置。然后界面会从最顶级的根View向下递归地把测量出的每一级、每一个子View的尺寸和位置赋值给这些子View
布局过程自定义
方式:重写布局过程的相关方法
- 测量过程:
onMeasure()
- 布局过程:
onLayout()
具体:
- 重写
onMeasure()
来修改已有的View的尺寸- 重写
onMeasure()
,并调用super.onMeasure()
触发原先的测量 - 用
getMeasuredWidth()
和getMeasuredHeight()
取到之前测得的尺寸,然后计算出最终尺寸 - 使用
setMeasuredDimension()
保存尺寸
- 重写
- 重写
onMeasure()
来全新计算自定义View的尺寸- 自己计算自定义View的尺寸
- 根据父View的尺寸限制修改自己的尺寸--调用
resolveSize()
方法
- 重写
onMeasure()
和onLayout()
来全新计算自定义ViewGroup的内部布局- 重写
onMeasure()
来计算内部布局- 调用每个子View的measure(),让子View自我测量
- 根据子View给出的尺寸,得出子View的位置,并保存它们的位置和尺寸
- 根据子View的位置和尺寸计算出自己的尺寸,并用setMeasuredDimension()保存
- 重写