0

我想创建与此类似的图形:https ://cdn.business2community.com/wp-content/uploads/2017/01/pie-charts.png.png

我使用具有四种不同颜色的 RectF 创建了一个分段圆。下面是我的代码:

Bitmap bitMap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
bitMap = bitMap.copy(bitMap.getConfig(), true);
// Construct a canvas with the specified bitmap to draw into
Canvas canvas = new Canvas(bitMap);

RectF oval = new RectF(10F, 5F, 45F, 5F);
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.GRAY);
canvas.drawArc(oval, 0F, 90F, true, paint);
paint.setColor(Color.GREEN);
canvas.drawArc(oval, 90F, 90F, true, paint);
paint.setColor(Color.RED);
canvas.drawArc(oval, 180F, 90F, true, paint);
paint.setColor(Color.BLACK);
canvas.drawArc(oval, 270F, 90F, true, paint);
canvas.rotate(43);
imageView.setImageBitmap(bitMap);

我想再创建一行 3 个这样的圆圈,但我无法获得它们,因为我无法识别确切的坐标。

4

2 回答 2

0

您应该在RectF构造函数中放置的坐标是相对于您在创建位图时放置的坐标Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888)。例如,使用 100x100 像素的位图,并以RectF这种方式设置:

new RectF(5f, 10f, 85f, 75f);

您将得到以下结果(ImageView背景为蓝色以清楚地看到其边界):

在此处输入图像描述

如您所见, 的限制RectF在位图坐标中设置,从左侧水平开始,从顶部垂直开始。

要创建三个饼图,您只需创建一个更大的位图(此处为 300x100)并偏移RectF每个新图表的坐标:

private fun drawPieCharts() {
    var bitMap = Bitmap.createBitmap(300, 100, Bitmap.Config.ARGB_8888)
    bitMap = bitMap.copy(bitMap.config, true)
    // Construct a canvas with the specified bitmap to draw into
    val canvas = Canvas(bitMap)

    drawSinglePie(canvas, 0f)
    drawSinglePie(canvas, 100f)
    drawSinglePie(canvas, 200f)

    imageView.setImageBitmap(bitMap)
}

private fun drawSinglePie(canvas: Canvas, horizontalOffset: Float) {
    val oval = RectF(5f + horizontalOffset, 10f, 85f + horizontalOffset, 75f)
    paint.style = Paint.Style.FILL
    paint.color = Color.GRAY
    canvas.drawArc(oval, 0f, 90f, true, paint)

    paint.color = Color.GREEN
    canvas.drawArc(oval, 90f, 90f, true, paint)

    paint.color = Color.RED
    canvas.drawArc(oval, 180f, 90f, true, paint)

    paint.color = Color.BLACK
    canvas.drawArc(oval, 270f, 90f, true, paint)
}

这将导致这个结果:

在此处输入图像描述

但是位图最终可能会像上面的屏幕截图一样被拉伸,所以更好的解决方案是创建一个自定义视图来避免这种像素化。

于 2019-04-02T20:50:04.710 回答
0

您定义RectF 第二个和第四个值是 5f 的方式存在问题,这意味着RectF宽度为 0: public RectF(float left, float top, float right, float bottom)

如果你让你的矩形更大,你的代码就可以工作。

于 2019-03-10T22:16:41.280 回答