在Android中默认所有的View都是直角的,但是大部分的设计师都喜欢按照苹果的风格来设计,也就是会出现很多圆角矩形的设计,对Android工程师来说会造成很多额外的麻烦。
1.实现圆角矩形对话框
如图所示,这是一个很常见的对话框设计,整个对话框背景是一个白色的圆角矩形框,但为了实现这种效果,Android开发的同学可能要付出很多额外的努力:
- 首先需要一个白色的圆角矩形背景,有2种方式:一是找设计师通过切图来提供,二是使用xml shape标签来创建,显然后者更好一点,可以减小包的大小;
- 如果底部有2个button,左边的button只有左下角是圆角的,右边的button只有右下角是圆角的,其他角是直角的;
- 如果底部只有1个button,显然该button的左下、右下角是圆角的;
- 每种圆角的button都可能有不同的颜色样式;
总的算来,1个圆角对话框背景图,3种圆角button背景图,每种圆角button背景有2种颜色的样式,这样需要定义 7(1 + 3 * 2 = 7) 种不同的 xml shape 资源文件,也是很繁琐的一件事。
2.ViewOutlineProvider实现圆角
幸运的是,在5.0以后Android提供了ViewOutlineProvider,可以为View动态设置圆角,再也不需要通过背景图来实现圆角了。
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void setBgRadius(View layoutContent, int bgRadius) {
layoutContent.setOutlineProvider(new ViewOutlineProvider() {
@Override
public void getOutline(View view, Outline outline) {
outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), bgRadius);
}
});
layoutContent.setClipToOutline(true);
}
注意该API在5.0以后才有,如果你的应用支持5.0以下,需要做好兼容,不过现在5.0以下的系统一般暂也不考虑了吧。
现在我们再来实现之前的那个圆角对话框:首先对话框的背景色只需设置成白色即可,再也不需要定义圆角的xml shape背景图了;其次button的背景图只需要定义一个白色和一个黄色的了,再也不用关心哪个角要定义成圆角了;最后,利用ViewOutlineProvider将对话框的根布局View设置成圆角。可见,通过这种方式实现圆角效果简单方便多了。
3.其他思考
ViewOutlineProvider实现圆角好用,但是也不要滥用,它实质上是对View进行裁切显示,可能会有额外的性能损耗,感兴趣的可以看看源码。