自定义视图---圆角柱状图(一)

2,873 阅读2分钟

一、写在前文

之前写过一篇博客 -- 巧妙使用WilliamChart绘制出只有两个圆角的柱状图,当时是项目需要,所以用了第三方的库去实现只有顶部带两个圆角的柱状图。虽然最终是实现了效果,但是第三方的图表自定义不够,例如控制柱状图的间距,高度等等。所以,最终决定自己去绘制圆角柱状图。

二、分析需求

首先是绘制圆角矩形,系统为我们提供的API为 drawRoundRect 参数如下:

对与rect,paint就不用解释了, 那么rx,ry具体是什么呢,请接着往下看:

这里写图片描述

其实rx,ry就是确定椭圆的两个焦半径,使用drawRoundRect时,会根据给定的rx,ry在矩形里面绘制4个四分之一椭圆,每个椭圆的位置以及大小由矩形的每个顶点加上rx,ry确定,由此可见效果如下:

这里写图片描述

由此可以推导,如果rx,ry其中一个等于0,那么绘制的最终形状还是原先的矩形, 如果矩形是正方形并且rx,ry 都等于正方形边长的二分之一,那么最终的形状为一个圆。可是到这里还是不够,需求是只有顶部带两个圆角的柱状图,现在可是带了四个圆角。

接下来还需要使用另外一个API,canvas的 clipRect方法,它可以设置画布需要显示的区域,换而言之,我们只要将显示区域设置小一点,使底部的圆角不在区域内即可。

三、代码实现

设置一个长宽都为100的正方形,将画布的显示矩阵底部的区域减少圆角的大小即可。

   Paint paint = new Paint();
   paint.setColor(Color.parseColor("#47b484"));
   RectF rect = new RectF(100, 100, 200, 200);
   int radius = 10;
   canvas.clipRect(100, 100, 200, 200 - radius );  // 必须先设置显示区域再绘制
   canvas.drawRoundRect(rect, radius , radius , paint);

效果如下:

这里写图片描述

四、总结

一开始在思考这个问题的时候,一直纠结于绘制圆角的数量,可是系统并没有提供此类的API,直到后来,换个角度一想,通过裁剪矩形同样可以实现自己的需求。这只是开始的第一步,这个系列接下来我会继续完善,请大家敬请期待。