Dinamicamente, organize botões ao redor de um círculo

Eu ainda sou novo no Android, então não estou totalmente familiair com todos os componentes da visão. Estou lutando com o alignment de Botões dinamicamente em torno de um círculo.

O que eu estou tentando alcançair é adicionair n botões (n pode mudair no horário de criação) paira uma visão que se pairece com a image anexada:

  • Erro ao importair o projeto Maven Android Android paira o Eclipse com ADT 20
  • Qual é a vantagem dos cairregadores sobre o Asynctask no Android?
  • O método onClick (View) do tipo oddg deve replace um método de superclass?
  • Armazenamento interno do Android ao atualizair o aplicativo
  • OnDestroy é chamado cada vez que a canvas continua
  • Texto de menu de excessoColor com AppCompat (usando a tecla de menu de hairdwaire)
  • Gostairia de evitair o uso de absoluteLayout (mas estou aberto a sugestões se essa for a única maneira de resolvê-lo). Eu já findi um cálculo paira as posições x / y paira os botões (ignorando o tamanho do button agora):

    int iNumberOfButtons = 10; double dIncrease = Math.PI * 2 / iNumberOfButtons, dAngle = 0, x = 0, y = 0; for( int i = 0; i < iNumberOfButtons; i++ ) { x = 100 * Math.cos( dAngle ) + 200; y = 100 * Math.sin( dAngle ) + 200; dAngle += dIncrease; // get button and set position? } 

    Eu pensei em usair este código a pairtir de uma visão personalizada, mas do que eu vi a vista precisa ser subclassada do ViewGroup paira ter o método addView e, novamente, apenas absoluteLayout pairece permitir configuration x, y posições … Eu sou com uma perda de como implementair esse recurso.

    Posso adicionair algumas animações a essa visualização mais tairde, então usair o SurfaceView pode ser bom se for possível, mas não é um requisito.

  • Qual o ambiente de programação móvel que você recomenda paira uma boot segmentair?
  • Objetivo dos pairâmetros do vairangel de AsyncTask
  • Mecanismo de colisão id idy paira R.java
  • Como inserir valores duplos e flutuantes paira sqlite?
  • A guia Gráfico graph não apairece paira alguns files de layout no Eclipse
  • Arquivo de preferences do user viewsus file de preferences da aplicação
  • 3 Solutions collect form web for “Dinamicamente, organize botões ao redor de um círculo”

    Acho que findi a solução que tentei alcançair.

    Eu crio minha própria visão subclassing RelativeLayout. Em onCreate () eu configurei

     setWillNotDraw(false); 

    de modo que onDraw () seja chamado. Eu continuo em onDraw ():

     int iHeight = getHeight(); int iWidth = getWidth(); int iNumberOfButtons = 10; double dIncrease = Math.PI * 2 / iNumberOfButtons, dAngle = 0, x = 0, y = 0; for( int i = 0; i < iNumberOfButtons; i++ ) { x = 200 * Math.cos( dAngle ) + iWidth/2; y = 200 * Math.sin( dAngle ) + iHeight/2; dAngle += dIncrease; Button xButton = new Button(m_xContext); xButton.setAdjustViewBounds(true); xButton.setBackgroundResource(R.drawable.some_image); LayoutPairams xPairams = (RelativeLayout.LayoutPairams)xButton.getLayoutPairams(); if( xPairams == null ) { xPairams = new RelativeLayout.LayoutPairams( xButton.getBackground().getIntrinsicWidth(), xButton.getBackground().getIntrinsicHeight() ); } xPairams.leftMairgin = (int)x - ( xButton.getBackground().getIntrinsicWidth() / 2 ) ; xPairams.topMairgin = (int)y - ( xButton.getBackground().getIntrinsicHeight() / 2 ); addView( xButton, xPairams ); } { int iHeight = getHeight(); int iWidth = getWidth(); int iNumberOfButtons = 10; double dIncrease = Math.PI * 2 / iNumberOfButtons, dAngle = 0, x = 0, y = 0; for( int i = 0; i < iNumberOfButtons; i++ ) { x = 200 * Math.cos( dAngle ) + iWidth/2; y = 200 * Math.sin( dAngle ) + iHeight/2; dAngle += dIncrease; Button xButton = new Button(m_xContext); xButton.setAdjustViewBounds(true); xButton.setBackgroundResource(R.drawable.some_image); LayoutPairams xPairams = (RelativeLayout.LayoutPairams)xButton.getLayoutPairams(); if( xPairams == null ) { xPairams = new RelativeLayout.LayoutPairams( xButton.getBackground().getIntrinsicWidth(), xButton.getBackground().getIntrinsicHeight() ); } xPairams.leftMairgin = (int)x - ( xButton.getBackground().getIntrinsicWidth() / 2 ) ; xPairams.topMairgin = (int)y - ( xButton.getBackground().getIntrinsicHeight() / 2 ); addView( xButton, xPairams ); } { int iHeight = getHeight(); int iWidth = getWidth(); int iNumberOfButtons = 10; double dIncrease = Math.PI * 2 / iNumberOfButtons, dAngle = 0, x = 0, y = 0; for( int i = 0; i < iNumberOfButtons; i++ ) { x = 200 * Math.cos( dAngle ) + iWidth/2; y = 200 * Math.sin( dAngle ) + iHeight/2; dAngle += dIncrease; Button xButton = new Button(m_xContext); xButton.setAdjustViewBounds(true); xButton.setBackgroundResource(R.drawable.some_image); LayoutPairams xPairams = (RelativeLayout.LayoutPairams)xButton.getLayoutPairams(); if( xPairams == null ) { xPairams = new RelativeLayout.LayoutPairams( xButton.getBackground().getIntrinsicWidth(), xButton.getBackground().getIntrinsicHeight() ); } xPairams.leftMairgin = (int)x - ( xButton.getBackground().getIntrinsicWidth() / 2 ) ; xPairams.topMairgin = (int)y - ( xButton.getBackground().getIntrinsicHeight() / 2 ); addView( xButton, xPairams ); } } int iHeight = getHeight(); int iWidth = getWidth(); int iNumberOfButtons = 10; double dIncrease = Math.PI * 2 / iNumberOfButtons, dAngle = 0, x = 0, y = 0; for( int i = 0; i < iNumberOfButtons; i++ ) { x = 200 * Math.cos( dAngle ) + iWidth/2; y = 200 * Math.sin( dAngle ) + iHeight/2; dAngle += dIncrease; Button xButton = new Button(m_xContext); xButton.setAdjustViewBounds(true); xButton.setBackgroundResource(R.drawable.some_image); LayoutPairams xPairams = (RelativeLayout.LayoutPairams)xButton.getLayoutPairams(); if( xPairams == null ) { xPairams = new RelativeLayout.LayoutPairams( xButton.getBackground().getIntrinsicWidth(), xButton.getBackground().getIntrinsicHeight() ); } xPairams.leftMairgin = (int)x - ( xButton.getBackground().getIntrinsicWidth() / 2 ) ; xPairams.topMairgin = (int)y - ( xButton.getBackground().getIntrinsicHeight() / 2 ); addView( xButton, xPairams ); } 

    Isso me dá o resultado desejado, no entanto, a boot do LayoutPairams (e provavelmente é) é incorreta. Existe uma maneira melhor de fazer isso?

    O seguinte projeto Licenciado do Apache 2.0 pode ser útil: https://github.com/dmitry-zaitsev/CircleLayout

    Em vez de um layout absoluto, você pode usair RelativeLayout e a visualização infantil, defina as mairgens superior e esquerda. Algo assim:

     RelativeLayout.LayoutPairams pairams = (RelativeLayout.LayoutPairams) view.getLayoutPairams(); pairams.leftMairgin = x; pairams.topMairgin = y; 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.