圆角的应用范围比较广,相比于直角,圆角的显示效果确实较好一点。但圆角并不是android的固有技能,不是所有的view都能通过简单的设置来显示圆角,需要有一种办法来创建一种什么场合都能使用的圆角。
以下以一个通用的圆角布局为例,创建一个圆角布局。
1 | public class RoundLayout extends LinearLayout { |
挑其中一个方法来解析:
1 | private void drawLeftUp(Canvascanvas){ |
这里定义了一个路径为
此时,(x,y)=(0,0),因为其其是使用getScrollX()与getScrollY()获取的。
然后通过RectF描述的矩形,使用arcTo截取椭圆的一段。
续上,如图,RectF定义的矩形为蓝色部分,通过arcTo方法 ,可以获取由此矩形内的一个椭圆的一段边,如
1 | path.arcTo(new RectF(x, y, x + m_radius * 2, y + m_radius * 2), −90, −90); |
代表的是从-90开始,旋转-90度(顺时针旋转为正,逆时针旋转为负,起始位置如是)。
如此就可以描述一条圆弧。
draw方法中定义了一个Canvas
1 |
|
其中,用来画线的画笔boarderPaint设置了一个参数:
1 |
|
把内存中的bitmap画到低级view的画布当中就可以了。这样就能实现无论什么 view都能圆角的效果。
需要说明一点的是,这种做法虽然较通用,但因为在draw方法里做了不少操作,需要先画到bitmap中再画到canvas中,性能肯定会受到一定的影响,而且相应的内存占用也会高一点,有部分机型上可能存在兼容问题,如显示的效果变模糊等 ,这都与bitmap不能说没关系。
======更新于2017-5-12=======
以上的方法用了几年,感觉良好,但最近在测试android7.0时,只要往layout中放入一个webview,webview就会出现很”卡“的情况,跟进了一下,发现其实也不是真的页面卡,而是因为重绘的过程里没把webview给更新到,所以看上去就是卡住不动了,事实上layout的draw是有绘制动作的。
目前的显示样式结构是这样的:
现在是在画webview时出问题了。
查看我们覆盖的draw方法,android已经不推荐我们去做这个修改了,的确这个方法是整个view绘制的入口,影响有点大。
1 | /** |
查看自定义view的重绘过程可知(http://blog.csdn.net/androidxiaogang/article/details/51895794) ,我们其实并不需要在draw上进行绘制,因为我们要画的其实是标题和webview这两个子view而已,作为窗口的layout已经被设置成了透明了。
按着这个思路,只针对子view进行重绘,在draw里,子view的绘制发生在:
1 | // Step 4, draw the children |
于是,只需要覆盖这个方法即可。修改后代码如下:
1 | protected void dispatchDraw(Canvas canvas) { |