2012-02-20 8 views
10

Tôi vẫn còn mới cho android nên tôi không hoàn toàn quen thuộc với tất cả các thành phần xem. Tôi đang vật lộn với việc căn chỉnh các Nút động quanh một vòng tròn.Tự động sắp xếp các Nút quanh Vòng tròn

Những gì tôi đang cố gắng để đạt được là để thêm các nút n (n có thể thay đổi vào thời điểm sáng tạo) để một cái nhìn trông giống như hình ảnh đính kèm:

Tôi muốn tránh sử dụng absoluteLayout (nhưng tôi mở để gợi ý nếu đó là cách duy nhất để giải quyết nó). tôi đã đưa ra một tính toán cho x/vị trí y cho các nút (bỏ qua kích thước nút cho bây giờ):

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

Tôi nghĩ về việc sử dụng mã này từ bên trong một giao diện tùy chỉnh nhưng từ những gì tôi đã nhìn thấy xem cần phải được phân lớp từ ViewGroup để có phương thức addView và sau đó một lần nữa chỉ absoluteLayout dường như cho phép thiết lập x, y position ... Tôi đang thua lỗ cách thực hiện tính năng này.

Tôi có thể thêm một số hoạt ảnh vào chế độ xem đó sau này, vì vậy việc sử dụng SurfaceView có thể tốt đẹp nếu có thể nhưng không phải là yêu cầu.

Trả lời

3

Tôi nghĩ rằng tôi đã tìm thấy giải pháp mà tôi đã cố gắng đạt được.

Tôi tạo chế độ xem của riêng mình phân lớp RelativeLayout. Trong onCreate() tôi đặt

setWillNotDraw(false); 

để onDraw() được gọi. sau đó tôi tiếp tục trong 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); 
    } 

này mang lại cho tôi những kết quả mong muốn, tuy nhiên Khởi tạo của LayoutParams cảm thấy (và rất có thể là) sai. Có cách nào tốt hơn để làm điều này?

+0

Tôi đang gặp sự cố khác với phương pháp này. onDraw() được gọi lặp đi lặp lại mà không phải là những gì tôi muốn khi thiết lập các nút ở đó. Tôi đoán tôi có lẽ có lẽ xung quanh việc khởi tạo với một và nếu một boolean nhưng là có một cách chấp nhận để thực hiện các hành vi tôi muốn? (ví dụ: Bắt đầu chế độ xem tùy chỉnh của tôi bằng các nút, được đặt trong vòng tròn từ trung tâm, mà không cần đến onDraw?) –

0

Thay vì bố cục tuyệt đối, bạn có thể sử dụng RelativeLayout và chế độ xem con, thiết lập lề trên và lề trái. Một cái gì đó như thế này:

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

Đó là một ý tưởng tốt, gợi ý của bạn đạt được những gì tôi đã cố gắng làm. Tôi đã phân lớp RelativeLayout cho mục này và tạo các nút trong onCreate. LayoutParams của họ (và những cái nhìn từ chính nó) là null tại thời điểm này mặc dù. Cách ưa thích để khởi tạo chúng là gì? Một yêu cầu khác mà tôi quên đề cập đến là vòng tròn nên được đặt ở giữa chế độ xem. Tôi nghĩ nó sẽ dễ dàng để chỉ cần thêm các giá trị tôi lấy từ getHeight() và getWidth() để bù đắp các vị trí nhưng cả hai phương thức đều trả về 0 (như getMeasuredWidth() và Height). Có cách nào để khắc phục điều đó? –