我想在android中创建一个自定义菜单,它应该如下图所示。
我已经实现了创建菜单的主要部分,不包括菜单点。所以看起来如下图。
此菜单是一个CustomView,我使用canvas.drawArc方法将这些弧绘制为RectF。 所以我认为这很明显,我想要实现的目标。我想将Arc细分为大小均匀的小弧,或者添加新的弧(正好在另一个弧上)。 我试图简单地将这些弧线的边界设置为较大弧线的1/3,但是,我无法通过这种方式实现这一结果。
有没有人知道这样做的方法,还是我完全改变了我的做法?
答案 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(角度)
重要的是要提到角度函数中的角度必须以弧度为单位。此外,我不得不减去/添加笔画的次数,因为我使用笔画样式来绘制这些弧,这意味着半径会到达笔画的中心。
我将这些值放在一个列表中,并在我绘制完所有内容后绘制它们,因此它们高于其他所有值。
我希望我能够帮助每个人,他们会遇到同样的问题。