利用已有Layout,减少开发逻辑

如果在开发过程中,需要自定义 ViewGroup,但是该 ViewGroup 重点不在于子 View 如何布局,而是对子 View 进行某些动画操作,这样的话如果单纯的继承 ViewGroup 再完全实现 onLayout() 等逻辑的话,就会很麻烦,这个时候,就可以继承已有布局,减少开发的逻辑。

就像在《贝塞尔曲线实战–BackgroundView》一文中需要的那种效果(如图):
这里写图片描述

而博主的实现思想,就是最开始说的那样,图中的叶子、云朵、山、树都是自定义的 View,然后将它们布局在一个以 RelativeLayout 为根布局的 xml 文件中(在文中即名为 background 的布局文件,以 RelativeLayout 为根布局只是为了方便布局内的子 View 进行布局,不是必须得以 RelativeLayout 为根布局,且与后面的 继承自 RelativeLayout 的 ViewGroup 无强制关联),然后自定义一个继承自 RelativeLayout 的 ViewGroup(名为 BackgroundView,这里不一定只能是继承自 RelativeLayout,其它的布局也行,具体原因在下面),在其构造函数中实现如下代码,同时还要在 BackgroundView 中实现叶子、云朵的动画逻辑:

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.background, this, true);

其中的关键就是 inflater.inflate(R.layout.background, this, true); 表示将第一个参数所指定的布局添加到第二个参数的 View 中(参考自:三个案例带你看懂LayoutInflater中inflate方法两个参数和三个参数的区别)。
这里就需要注意粗体的字的意思,“添加到第二个 View 中“,这样做自然减少了一些不必要的逻辑,但是实际上会增加一层布局层级,从布局的分析就可以知道:
这里写图片描述
在上图中,CoordinatorLayoutmain_activity 对应的布局文件的根节点,然后 BackgroundView 即为上面说的自定义的 ViewGroup,而在它的下一级还有一个相对布局,再下一级则是树叶等自定义的 View。

可能有人会想,为什么不直接在 CoordinatorLayout 下添加那个相对布局,省略掉 BackgroundView 这一层,然后直接在 Activity 中实现叶子等的动画逻辑,对于这一点,是因为博主把BackgroundView 已经封装成一个库了,这在调用起来就十分方便了,而不需要每次都在添加叶子等子 View 且去实现它们的动画,这样会很麻烦的。
或者还有人会想,为什么不在 BackgroundView 继承 RelativeLayout 的同时,不是使用

inflater.inflate(R.layout.background, this, true);

将下一级布局添加到 BackgroundView 中,而是直接动态的在 BackgroundView 中添加子 View,这样不就能减少一个布局层级吗?请看一下标题,有时候就是为了减少开发的逻辑,就选择用空间换时间的策略咯。如果是动态的添加的话,就需要用代码一行一行的实现所有目标子 View 的添加,以及它们的布局逻辑,而不像直接在 xml 文件中那么方便。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值