Android的圆形菜单像抓注(Android Circle Menu Like Catch Not

2019-08-02 01:36发布


我尝试做圆形菜单想在这个应用程序。

在“扩展”模式我画这个组件类似如下:

<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.Pathandroid.graphics.Paint和一些数学。
视觉上我已经完全按照屏幕截图所示。 但是,当我按下圆的一部分,我需要另一种颜色重绘此部分显示用户什么一些事情。

我怎样才能重新绘制组件的画布,从画布上的另一部分切断的部分android.graphics.Path的例子。
在另一个字我知道重绘的画布,我应该在的onDraw方法做,我知道我可以显示从画在Photoshop中可绘制某些位图,并有一些“多屏的麻烦”,我知道我可以决定哪些用户按下一部分。 但是我不知道我可以选择画布的一部分,并重绘。

Answer 1:

捕捉的开发者在这里。 如果我理解你的问题,你就无法理解如何具体绘制高亮/选择指示符在你的环形菜单的一部分。

虽然有很多不同的方法之一可以实现它,你朝(使用扶着什么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等)可以提前构建的时间(或一次,在第一次发生)和重用。

希望这是接近你问的是什么!



文章来源: Android Circle Menu Like Catch Notes