自定义view

继承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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值