在定义ShapeDrawable时,需要传入一个Shape对象。它代表着一个具体的形状。其类结构图如下:
其中倒数第二个OvalShadow是CircleImageView中的内部类,外部无法使用。
根据一个Path路径创建一个Shape。如下:
Path path = new Path();//创建Path path.moveTo(10, 10); path.lineTo(70, 70); path.lineTo(30, 20); path.close(); PathShape shape = new PathShape(path, 100, 100);//创建PathShape ShapeDrawable drawable = new ShapeDrawable(shape);//创建ShapeDrawable Drawable wrap = DrawableCompat.wrap(drawable.mutate()); wrap.setBounds(0, 0, getWidth(), getHeight());//一定要设置bounds,否则不显示 DrawableCompat.setTint(wrap,Color.GREEN);//设置该Drawable显示的颜色 drawable.draw(canvas);
矩形。直接new一个对象传到ShapeDrawable中当参数即可。想控件显示样式,可通过Drawable#getPaint()获取Paint对象,而且设置即可。
椭圆。其椭圆为由setBounds()指定的内接椭圆。
椭圆的一部分。该椭圆是通过setBounds()定义的内接椭圆。
圆角矩形。
第一个参数为圆角的半径。注:该圆角为某个椭圆的一部分,而椭圆的长短半轴由第一个参数中相应的位置指定。
第二个参数为内矩形与外矩形各边的距离。
第三个参数为内矩形的圆角半径。与第一个参数一样。如下:
RoundRectShape shape = new RoundRectShape(new float[]{10, 20, 30, 40, 10, 20, 30, 40}, new RectF(30,30,30,30), new float[]{ 30, 40, 10, 20, 30,10, 20, 40}); ShapeDrawable drawable = new ShapeDrawable(shape);
效果图如下,其中中间的空白区域为内矩形,红色的厚度为第二个参数指定的。
wrap():代理一个drawable对象,后继的操作应该是该方法的返回值。示例如PathShape的例子。
setTint():设置当前drawable的颜色。