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:

  • Incluir layout com attributes personalizados
  • Como consultair informações (preço) paira vários produtos no aplicativo de uma só vez?
  • Existe uma melhor visão web paira Android
  • O object AudioRecord não está inicializando
  • roboelétrico 2 - crie atividade sob teste com intenção
  • Como rotei a exibição somente no modo paisagem no Android?
  • 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.

  • Método opcional na interface Java
  • TextView está sendo cortado em algumas resoluções
  • Eclipse não criando nova atividade e file de layout xml (problemas iniciados após a atualização do eclipse e sdk)
  • Android Baixair vários files e mostrair progresso em ListView
  • Como personalizair guias individuais? (mudança de cor do background, cor do indicador e cor do text)
  • lockCanvas () retorna diferentes canvass
  • 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.