在Android中绘制一个分段圈:OpenGL vs Canvas?

时间:2014-11-03 15:50:07

标签: android opengl-es android-canvas

我需要画出这样的东西:

Segmented circle with content on each segment

我希望this guy发布一些代码,说明他是如何开始划分他的分段圈的,但唉他没有。

我还需要知道在与车轮交互后哪个段在哪里 - 例如,如果车轮旋转,我需要知道旋转动作后原始段的位置。

两个问题:

  1. 我是否使用 OpenGL 或使用Android Canvas 绘制此分段圈(具有不同的颜色和内容)?
  2. 使用其中一个选项,我如何注册哪个细分
  3. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    修改

    好的,所以我已经弄清楚如何 draw the segmented circle 使用Canvas(我会将代码作为答案发布)。我相信我会很快弄清楚如何旋转圆圈。但是我仍然不确定在旋转动作之后我将如何识别出绘制轮的单独部分

    因为,我正在考虑做的是使用这些楔形绘制分段圆,以及当我想要旋转它时将整个Canvas作为ImageView进行处理,就好像它在旋转一样。但是当旋转停止时,我如何区分Canvas上绘制的原始段?

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    我已经了解了如何绘制segment on its ownhere also),OpenGLCanvas甚至drawing shapes and layering them,但我还没有看到某人解释如何识别单独的细分

    可以使用drawBitmap()createBitmap()吗?

    如果我使用OpenGL,我可能会使用OpenGL's rotation 旋转分段滚轮,对吧?

    我还读到OpenGL可能对我想做的事情太强大了,所以我应该考虑“the graphic components of a game library built on top of OpenGL”吗?

1 个答案:

答案 0 :(得分:1)

这种答案是我上面的第一个问题 - 如何使用Android Canvas绘制分段圈:

使用code found here,我在onDraw函数中执行此操作:

    // Starting values
    private int startAngle = 0;
    private int numberOfSegments = 11;
    private int sweepAngle = 360 / numberOfSegments;

    @Override
    protected void onDraw(Canvas canvas) {

        setUpPaint();

        setUpDrawingArea();

        colours = getColours();

        Log.d(TAG, "Draw the segmented circle");
        for (int i = 0; i < numberOfSegments; i++) {

            // pick a colour that is not the previous colour
            paint.setColor(colours.get(pickRandomColour()));

            // Draw arc
            canvas.drawArc(rectF, startAngle, sweepAngle, true, paint);

            // Set variable values
            startAngle -= sweepAngle;
        }
    }

这是我根据设备的屏幕尺寸设置绘图区域的方法:

private void setUpDrawingArea() {
        Log.d(TAG, "Set up drawing area.");

        // First get the screen dimensions
        Point size = new Point();

        Display display = DrawArcActivity.this.getWindowManager().getDefaultDisplay();
        display.getSize(size);
        int width = size.x;
        int height = size.y;

        Log.d(TAG, "Screen size = "+width+" x "+height);

        // Set up the padding
        int paddingLeft = (int) DrawArcActivity.this.getResources().getDimension(R.dimen.padding_large);
        int paddingTop = (int) DrawArcActivity.this.getResources().getDimension(R.dimen.padding_large);
        int paddingRight = (int) DrawArcActivity.this.getResources().getDimension(R.dimen.padding_large);
        int paddingBottom = (int) DrawArcActivity.this.getResources().getDimension(R.dimen.padding_large);

        // Then get the left, top, right and bottom Xs and Ys for the rectangle we're going to draw in
        int left = 0 + paddingLeft;
        int top = 0 + paddingTop;
        int right = width - paddingRight;
        int bottom = width - paddingBottom;

        Log.d(TAG, "Rectangle placement -> left = "+left+", top = "+top+", right = "+right+", bottom = "+bottom);

        rectF = new RectF(left, top, right, bottom);
    }

那个(以及其他很直接的功能,所以我不打算在这里粘贴代码)得出这个: 每次运行时段都是不同的颜色。

Segmented circle