我尝试做圆形菜单想在这个应用程序。
在“扩展”模式我画这个组件类似如下:
<RelativeLayout android:id="@+id/bigCircle">
<!--color full borders-->
<my.custom.component android:id="@+id/middleCircle">
<!--circle for buttons-->
<RelativeLayout android:id="@+id/smallCircle">
<!--minus button-->
</RelativeLayout>
</my.custom.component>
</RelativeLayout>
在的onDraw方法my.custom.component
我通过使用分8份圆android.graphics.Path
与android.graphics.Paint
和一些数学。
视觉上我已经完全按照屏幕截图所示。 但是,当我按下圆的一部分,我需要另一种颜色重绘此部分显示用户什么一些事情。
我怎样才能重新绘制组件的画布,从画布上的另一部分切断的部分android.graphics.Path
的例子。
在另一个字我知道重绘的画布,我应该在的onDraw方法做,我知道我可以显示从画在Photoshop中可绘制某些位图,并有一些“多屏的麻烦”,我知道我可以决定哪些用户按下一部分。 但是我不知道我可以选择画布的一部分,并重绘。
捕捉的开发者在这里。 如果我理解你的问题,你就无法理解如何具体绘制高亮/选择指示符在你的环形菜单的一部分。
虽然有很多不同的方法之一可以实现它,你朝(使用扶着什么android.graphics.Path
)是我们如何做的。 在我们拍摄按钮的视图层次,有,是作为其选择高亮颜色(如果有一个活动的选择)被绘制在画布上的元素。
如果你有一个类似的自定义View
中的布局,你可以复制像这样此行为。 首先,你需要的Path
,它定义了一个特定的圆弧段的选择。 使用Path.addArc(RectF, float, float)
我们可以得到我们需要的比萨饼片形路径:
private Path getPathForSegment(float startAngle, float sweep) {
Point center = new Point(getWidth() / 2, getHeight() / 2);
RectF rect = new RectF(0f, 0f, getWidth(), getHeight());
Path selection = new Path();
selection.addArc(rect, startAngle, sweep);
selection.lineTo(center.x, center.y);
selection.close();
return selection;
}
所述getWidth()
和getHeight()
以上是针对封闭定制的视图对象,因此它们定义包含在其上选择被绘制的圆的边界框。
然后,在自定义视图的onDraw(Canvas)
,如果你的代码已经确定的选择应绘制段:
@Override
protected void onDraw(Canvas canvas) {
// Assume one has the rest of these simple helper functions defined
if (shouldDrawSelection()) {
float startAngle = getStartAngleOfSelectedSegment();
float sweep = getSweepAngle();
Paint paint = getPaintStyleForSelectedSegment();
Path path = getPathForSegment(startAngle, sweep);
canvas.drawPath(path, paint);
}
// ...
super.onDraw(canvas);
}
在被跟踪的触摸你的代码的其他区域,只需调用invalidate()
上的自定义视图,以便将重绘(或没有)的基础上输入或状态变化的选择路径。
请记住,这是很好的做法,以避免new
的ING对象onDraw()
所以大部分这些构建模块( Path
S, Paint
S等)可以提前构建的时间(或一次,在第一次发生)和重用。
希望这是接近你问的是什么!