Java 尝试制作一个圆形布局,元素围绕中心以不同的距离放置

Java 尝试制作一个圆形布局,元素围绕中心以不同的距离放置,java,android,android-layout,user-interface,mobile,Java,Android,Android Layout,User Interface,Mobile,我正在构建一个android原型应用程序,并尝试制作一个圆形布局。基本上,我有一个中心点,我希望能够把其他元素放在一个圆圈里。我尝试使用了一个名为ArcLayout的库,它工作得很好,但对于我想做的事情来说,它不太管用。我试图放置的元素与中心之间有一个动态距离,并且在任何给定时间都可能有类似或相同的距离 我可以为每个距离级别创建一个新的圆弧布局,但我试图避免。理想情况下,布局中的每个元素应将自身定位在与所有其他元素的最大距离处,同时保持与中心的正确距离 我查了很多不同的东西,从雷达图到轨道动画,

我正在构建一个android原型应用程序,并尝试制作一个圆形布局。基本上,我有一个中心点,我希望能够把其他元素放在一个圆圈里。我尝试使用了一个名为ArcLayout的库,它工作得很好,但对于我想做的事情来说,它不太管用。我试图放置的元素与中心之间有一个动态距离,并且在任何给定时间都可能有类似或相同的距离

我可以为每个距离级别创建一个新的圆弧布局,但我试图避免。理想情况下,布局中的每个元素应将自身定位在与所有其他元素的最大距离处,同时保持与中心的正确距离


我查了很多不同的东西,从雷达图到轨道动画,它们似乎都不符合我想要做的。我将如何制作这样的东西?

以下是我将如何制作的详细说明:

使原始视图扩展视图类。在ondraw方法中,执行以下操作:

  • 首先,通过getWidth()/2、getHeight()/2获取小圆的坐标,在视图中心绘制圆。设置一些固定半径。将中心存储为cx、cy

  • 现在,您需要在正确的位置绘制其他圆,因此需要每个圆的中心。现在,从cx,cy开始,如果你有它与x轴的夹角,以及从cx,cy到新点的距离,你可以得到新点的坐标,如下所示:

       cx1 = cx + r*cos(theta) and cy2 = cy + r*sin(theta). 
      where r is the distance between the points and theta is the angle between line joining the points and the positive x-axis.
    
  • 请记住在计算中将度转换为弧度

  • 获得新圆的坐标后,只需使用canvas.drawCircle方法绘制它
  • 根据需要重复此方法
    以下是我将如何做到这一点的高级描述:

    使原始视图扩展视图类。在ondraw方法中,执行以下操作:

  • 首先,通过getWidth()/2、getHeight()/2获取小圆的坐标,在视图中心绘制圆。设置一些固定半径。将中心存储为cx、cy

  • 现在,您需要在正确的位置绘制其他圆,因此需要每个圆的中心。现在,从cx,cy开始,如果你有它与x轴的夹角,以及从cx,cy到新点的距离,你可以得到新点的坐标,如下所示:

       cx1 = cx + r*cos(theta) and cy2 = cy + r*sin(theta). 
      where r is the distance between the points and theta is the angle between line joining the points and the positive x-axis.
    
  • 请记住在计算中将度转换为弧度

  • 获得新圆的坐标后,只需使用canvas.drawCircle方法绘制它
  • 根据需要重复此方法
    我可以为每个距离级别创建一个新的圆弧布局,或者您可以查看该库的实现(这不是很复杂)并对其进行修改,以便可以为每个子级添加半径值。这样,您还可以实现元素之间所需的最小距离。@Luksprog不幸的是,我不完全确定如何进行此操作,您有任何示例吗?@Luksprog最小距离也不起作用,因为元素无论如何都会聚集在一起(尽管他们不会碰,这将是一个很大的进步)它可能会导致冲突,因为元素的数量本身是可变的。让所有元素都将自身定位在与其他所有元素的最大距离可以确保布局均匀分布,而不考虑元素的属性。我可以为每个距离级别创建一个新的弧形布局,或者您可以查看implem那个图书馆的入口(不是很复杂)并对其进行修改,这样您就可以为每个子元素添加一个半径值。这样,您还可以实现元素之间所需的最小距离。@Luksprog不幸的是,我不完全确定如何进行此操作,您有任何示例吗?@Luksprog minimum distances也不起作用,因为元素有聚集的趋势不管怎样,我们在一起(尽管他们不会接触,这将是一个很大的进步)它可能会导致冲突,因为元素的数量本身是可变的。让所有元素与其他元素保持最大的距离可以确保布局均匀分布,而不管元素的属性如何。如果我在制作静态布局,这将是很好的,但我正在尝试构建距离围绕中心旋转的元素的数量必须是动态的,因为这是UI不可分割的一部分。为了简单起见,我只画了几个圆,但围绕中心旋转的元素的数量也必须是动态的。我可以编写一些逻辑代码,从预定义的角度数组中随机抽取,并针对不同的范围使用不同的数组距离,但这似乎过于复杂且不够可扩展。您可以更改圆的数量并调用invalidate,除非我遗漏了一些内容。我只是不确定此解决方案如何能够将每个圆放置在与中心成正确角度的位置,同时与其他圆保持最大距离。根据我所了解的站着,这只是相对于中心的圆定位一个圆。如果我在做一个静态布局的话,这会很好,但是用我试图建立的元素围绕中心的距离必须是动态的,因为这是UI不可分割的一部分。为了简单起见,我只画了几个圆,但是元素的数量我们的轨道也必须是动态的。我可以编写一些逻辑代码,从预定义的角度数组中随机抽取,并为不同的距离范围使用不同的数组,但这似乎过于复杂,而且伸缩性不够。你可以更改圈数并调用invalidate,除非我遗漏了什么。我只是不确定该解决方案将如何使每个圆与中心成正确的角度,同时与另一个圆保持最大距离