继承View
就是自己画想要的图形
重写onmeasure、onDraw
渐变的文字的实现
继承ViewGroup
组合view
重写onMeasure、onLayout
flowLayout\viewPager
measureChildren(widthMeasureSpec, heightMeasureSpec);
1、onMeasure:计算子view宽高的和,然后和父view的限制,得到最终的viewGroup的宽高,setMeasureDimension
2、onLayout:将子View逐个摆放
//我们将高度设置为所有子View的高度相加,宽度设为子View中最大的宽度
int height = getTotleHeight();
int width = getMaxChildWidth();
https://www.jianshu.com/p/c84693096e41
组装多个view合成一个自定义view
inflate xml文件
inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)
从一个指定的xml资源中填充一个新的视图层
attachToRoot :代表的是解析出来的View是否要添加到root中
https://www.cnblogs.com/zarea/p/4822158.html
attr和TypedArray
attr就是布局文件xml控件的属性
TypedArray是styles里面配置的属性
activity的style会覆盖application的style
如何优化自定义View
先从onDraw开始,需要特别注意不应该在这里做内存分配的事情,因为它会导致GC,从而导致卡顿。在初始化或者动画间隙期间做分配内存的动作。不要在动画正在执行的时候做内存分配的事情。
你还需要尽可能的减少onDraw被调用的次数,大多数时候导致onDraw都是因为调用了invalidate().因此请尽量减少调用invaildate()的次数。如果可能的话,尽量调用含有4个参数的invalidate()方法而不是没有参数的invalidate()。没有参数的invalidate会强制重绘整个view。
另外一个非常耗时的操作是请求layout。任何时候执行requestLayout(),会使得Android UI系统去遍历整个View的层级来计算出每一个view的大小。如果找到有冲突的值,它会需要重新计算好几次。另外需要尽量保持View的层级是扁平化的,这样对提高效率很有帮助。
自带控件
开源库
自定义view
尺寸
用super.onMeasure,修改view的尺寸,然后setMeasureDimension
不用super.onMeasure,全部自己来计算尺寸
然后调用resolveSize,返回的结果就是符合父view限制,修正后的结果
最后然后setMeasureDimension
布局
绘制
重写绘制方法
最常用重写onDraw
canvas
- 绘制类方法drawXXX
- 辅助类方法 范围裁剪clipXXX和几何变换matrix
- 绘制顺序
触摸反馈
自定义View如何考虑机型适配?
合理使用warp_content,match_parent。尽可能地使用RelativeLayout。
自定义view效率高于xml定义吗?说明理由。
自定义view效率高于xml定义:
1、少了解析xml。
2.、自定义View 减少了ViewGroup与View之间的测量,包括父量子,子量自身,子在父中位置摆放,当子view变化时,父的某些属性都会跟着变化
ApplicationContext. Activity context也是生命周期的长短区别
降低UI层级
依赖父Layout布局属性
如何优化自定义View
注意UI层级
不要在onDraw方法内创建绘制对象
减少绘制次数
硬件加速
Android的wrap_content是如何计算的
https://www.cnblogs.com/duanweishi/p/4301742.html
View和SurfaceView的区别:
View适用主动更新,SurfaceView 适用被动更新,如频繁的刷新
View在UI线程更新,在非UI线程更新会报错,当在主线程更新view时如果耗时过长也会出错, SurfaceView在子线程刷新不会阻塞主线程,适用于界面频繁更新、对帧率要求较高的情况。
SurfaceView可以控制刷新频率。
SurfaceView底层利用双缓存机制,绘图时不会出现闪烁问题
自定义View,ViewGroup注意那些回调?
1、构造方法
2、onFinishInflate
3、onAttachedToWindow
4、onDetachedFromWindow
5、onWindowFocusChanged
6、onTouchEvent
执行顺序
draw()–onDraw()–dispatchDraw
Canvas
Canvas的含义-画板、画布和图层
如何获得Canvas
Canvas的变换
Canvas的绘图
恢复和保存
https://www.jianshu.com/p/510e415c56f2