Android - 细分菜单使用Arc

时间:2017-08-31 19:50:29

标签: android android-custom-view android-menu

我想在android中创建一个自定义菜单,它应该如下图所示。

菜单图片 enter image description here

我已经实现了创建菜单的主要部分,不包括菜单点。所以看起来如下图。

菜单的当前状态 enter image description here

此菜单是一个CustomView,我使用canvas.drawArc方法将这些弧绘制为RectF。 所以我认为这很明显,我想要实现的目标。我想将Arc细分为大小均匀的小弧,或者添加新的弧(正好在另一个弧上)。 我试图简单地将这些弧线的边界设置为较大弧线的1/3,但是,我无法通过这种方式实现这一结果。

有没有人知道这样做的方法,还是我完全改变了我的做法?

1 个答案:

答案 0 :(得分:0)

确定。经过一些研究,实验和简单的数学计算,我得出了以下代码。

 private void drawMenu(Canvas canvas, RectF arcBoundaries, int arcAngle, int sweep, Paint arcPaint, MenuPosition position, double scaleValue, int strokeWidth) {

        int countAllMenuItems = getMenuCount(position);
        int newAngle = arcAngle;
        int counter = 0;

        for (MenuItemView menuItem : menuItems) {
            if (menuItem.getPosition().toLowerCase().equals(position.toString().toLowerCase())) {
                canvas.drawArc(arcBoundaries, newAngle, sweep / countAllMenuItems, false, arcPaint);
                newAngle += sweep / countAllMenuItems;
                if (counter != countAllMenuItems - 1) {
                    calculateLines(arcBoundaries, newAngle, strokeWidth);
                }
                counter++;
            }
        }

    }
}

private void calculateLines(RectF arcBoundaries, int angle, int strokeWidth) {
    int realAngle = angle % 360;
    float xRadius = arcBoundaries.width()/2;
    float yRadius = arcBoundaries.height()/2;

    double x = arcBoundaries.centerX() + (xRadius-(strokeWidth/2))*Math.cos(realAngle * Math.PI / 180);
    double y = arcBoundaries.centerY() + (yRadius-(strokeWidth/2))*Math.sin(realAngle * Math.PI / 180);
    double xEnd = arcBoundaries.centerX() + (xRadius+(strokeWidth/2))*Math.cos(realAngle * Math.PI / 180);
    double yEnd = arcBoundaries.centerY() + (yRadius+(strokeWidth/2))*Math.sin(realAngle * Math.PI / 180);


    lineList.put(new Point((int) x, (int) y), new Point((int) xEnd, (int) yEnd));
}

实际上很简单。通过计算所有MenuItems和扫掠角度,我计算每条线的角度。然后我使用角度函数来计算x和y的开始和结束值。

所以我使用公式:

x(相邻边)= centerX(调整到坐标系)+斜边* cos(角度)

y(对面)= centerY(调整到坐标系)+斜边* sin(角度)

重要的是要提到角度函数中的角度必须以弧度为单位。此外,我不得不减去/添加笔画的次数,因为我使用笔画样式来绘制这些弧,这意味着半径会到达笔画的中心。

我将这些值放在一个列表中,并在我绘制完所有内容后绘制它们,因此它们高于其他所有值。

我希望我能够帮助每个人,他们会遇到同样的问题。