2012-02-20 3 views
10

저는 아직 안드로이드에 익숙하지 않아 모든 뷰 구성 요소에 익숙하지 않습니다. 버튼을 원 주위에서 동적으로 정렬하는 데 어려움을 겪고 있습니다.동그라미 주위에 동적으로 버튼 배열하기

무엇을 달성하려고하는 것은 첨부 된 이미지처럼 보이는보기로 n 개의 버튼을 추가 (N 작성시에 변경할 수 있습니다)입니다 :

나는 absoluteLayout을 사용하지 않도록하고 싶습니다 (하지만 그 문제를 해결할 수있는 유일한 방법이라면 제안 할 수 있습니다). 내가 본 내가 무엇을 사용자 지정보기 내부에서 만에서이 코드를 사용하는 방법에 대한 생각

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? 
    } 

: 는 이미 버튼에 대한 X/Y 위치에 대한 계산 (지금은 버튼 크기를 무시)를 내놓았다 보기는 ViewView에서 하위 클래스로 만들어야 addView 메소드를 가질 수 있으며, 다시 absoluteLayout 만 x, y 위치 설정을 허용하는 것처럼 보입니다 ...이 기능을 구현하는 방법은 손실됩니다.

나중에 해당 뷰에 애니메이션을 추가 할 수도 있습니다. 가능한 경우 SurfaceView를 사용하는 것이 좋지만 필수 사항은 아닙니다.

답변

3

내가 달성하려고 시도한 해결책을 찾았습니다.

RelativeLayout을 서브 클래 싱하는 자체보기를 만듭니다. onCreate()에서 onDraw()가 호출되도록

setWillNotDraw(false); 

으로 설정했습니다. 나는 다음의 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); 
    LayoutParams xParams = (RelativeLayout.LayoutParams)xButton.getLayoutParams(); 
    if(xParams == null) 
    { 
     xParams = new RelativeLayout.LayoutParams(xButton.getBackground().getIntrinsicWidth(), xButton.getBackground().getIntrinsicHeight()); 
    } 
    xParams.leftMargin = (int)x - (xButton.getBackground().getIntrinsicWidth()/2) ; 
    xParams.topMargin = (int)y - (xButton.getBackground().getIntrinsicHeight()/2); 
    addView(xButton, xParams); 
    } 

, 그러나의 LayoutParams의 초기화가 잘못된 느낌 (가장 가능성이 높습니다). 이 작업을 수행하는 더 좋은 방법이 있습니까?

+0

나는이 접근법에 또 다른 문제를 겪고있다. onDraw()는 버튼을 설정할 때 원하는 것이 아닌 반복적으로 호출됩니다. 아마도 if 및 boolean으로 초기화를 둘러 쌀 수 있지만 원하는 동작을 구현할 수있는 방법이 있습니까? (예 : 버튼을 사용하여 내 맞춤보기를 초기화하고 onDraw를 사용하지 않고 가운데에서 원으로 배치) –

0

절대 레이아웃 대신 RelativeLayout을 사용하고 하위보기에서 위쪽 및 왼쪽 여백을 설정할 수 있습니다. 이 같은 것을 :

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams(); 
params.leftMargin = x; 
params.topMargin = y; 
+0

, 당신의 제안은 내가하려고했던 것을 달성 할 수있다. RelativeLayout에 대한 하위 클래스를 만들고 onCreate에 버튼을 만듭니다. 그들의 LayoutParams (및 뷰 자체의 것들)는이 시점에서 null입니다. 그것들을 초기화하는 기본 방법은 무엇입니까? 언급하지 않은 또 다른 요구 사항은 원이 뷰의 중앙에 위치해야한다는 것입니다. 나는 getHeight()와 getWidth()에서 가져온 값을 위치를 오프셋하기 위해 추가하는 것이 쉽지만 두 메소드 모두 getMeasuredWidth()와 Height처럼 0을 반환한다고 생각했습니다. 그 문제를 해결할 방법이 있습니까? –