2012-03-03 12 views
6

Tôi đã tạo chế độ xem tùy chỉnh trong Android để hiển thị bóng trên màn hình. Bây giờ những gì tôi muốn là khi tôi chạm vào quả bóng nó sẽ phát nổ trong bốn phần và mỗi phần nên di chuyển bốn hướng khác nhau tức là lên, xuống, trái, phải. Tôi biết tôi phải thiết lập người nghe cảm ứng để phát hiện cảm ứng trên quả bóng nhưng sau đó làm thế nào để tạo ra một hiệu ứng nổ? Vấn đề này được giải quyết ngay bây giờ. Tôi đang hiển thị nhiều quả bóng trên màn hình để người dùng có thể nhấp vào nó và phát nổ chúng.Vấn đề nhấp chuột đối tượng tùy chỉnh trong android

Đây là giao diện tùy chỉnh của tôi:

public class BallView extends View { 
    private float x; 
    private float y; 
    private final int r; 
    public BallView(Context context, float x1, float y1, int r) { 
     super(context); 
     this.x = x1; 
     this.y = y1; 
     this.r = r; 
    } 
    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     canvas.drawCircle(x, y, r, mPaint); 
    } 

} 

SmallBall với tính chất tương tự, ngoại trừ một trong đó là định hướng và một nổ phương pháp để di chuyển nó theo hướng và hình ảnh động cờ để ngăn chặn nó di chuyển.

private final int direction; 
private boolean anim; 

public void explode() { 
    // plus or minus x/y based on direction and stop animation if anim flag is false 
    invalidate(); 
} 

layout xml của tôi là như sau:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout android:id="@+id/main_view" 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="#FF66FF33" /> 

tôi thêm BallView và SmallBall đến lớp hoạt động như sau:

final FrameLayout mainFrameLayout = (FrameLayout) findViewById(R.id.main_frame_layout); 

SmallBall[] smallBalls = new SmallBall[4]; 
smallBalls[0] = new SmallBall(getApplicationContext(), 105, 100, 10, 1, false); 
smallBalls[0].setVisibility(View.GONE); 
mainFrameLayout .addView(smallBalls[0]); 
// create and add other 3 balls with different directions. 

BallView ball = new BallView(getApplicationContext(), 100, 100, 25, smallBalls); 
listener = new MyListener(ball); 
ball.setOnClickListener(listener); 

mainFrameLayout.addView(ball); 

tôi thêm nhiều BallView và người giám hộ Mảng SmallBall tại các vị trí khác nhau. Bây giờ những gì xảy ra không có vấn đề mà tôi nhấp vào màn hình cuối cùng thêm BallView bắt đầu nổ. Sau giây phút cuối cùng, v.v. Vì vậy, đây là 2 vấn đề:

  1. Tại sao nó gọi sự kiện onClick/onTouch bất kể tôi nhấp vào màn hình ở đâu? Nó chỉ nên gọi sự kiện nghe khi tôi bấm vào BallView cụ thể.
  2. Và thứ hai là lý do tại sao BallView bắt đầu bùng nổ theo cách ngược lại cách chúng được thêm vào bố cục?

lớp nghe tôi:

public void onClick(View v) { 
     BallView ballView = (BallView) v; 
     ballView.setVisibility(View.GONE); 
     //get small balls associated with this ball. 
     //loop through small ball and call their explode method. 
    } 

Tôi đã tỉa code do giới hạn nhân vật trong câu hỏi.

+0

Bạn đang gặp phải vấn đề gì trong việc mã hóa hiệu ứng phát nổ? Bạn có muốn các hoạt hình chuyển động của các bộ phận hoặc đồ họa nổ? Nó sẽ tốt hơn nếu bạn có thể cung cấp một hình ảnh hoặc một cái gì đó bạn muốn đạt được. – noob

+0

@Creator: Điều tôi muốn là khi ai đó nhấp vào bất kỳ quả bóng nào cần phát nổ trong bốn quả bóng nhỏ và mỗi bức tường sẽ di chuyển theo một trong bốn hướng. Tôi không chắc chắn về những gì để sử dụng cho điều này như tôi mới đến android. Có thể là hoạt hình của các bộ phận bị nổ sẽ là lựa chọn tốt. –

+0

Kiểm tra Câu trả lời của tôi – noob

Trả lời

1

Tôi không nghĩ bạn cần phải mã hóa tất cả điều này trong canvas. Bạn có thể gọi ball.setVisibility(View.GONE) trong Trình xử lý cảm ứng và hiển thị thêm 4 quả bóng bằng cách sử dụng smallBall.setVisibility(View.Visible) cho mỗi quả bóng nhỏ. Bằng cách này bạn sẽ có thể ẩn bóng lớn và có thể hiển thị những quả bóng nhỏ. Bây giờ cho hiệu ứng chuyển động, có thể có một phương pháp trong mỗi smallBall nơi hướng cần phải được thông qua và bạn có thể gọi nó như thế này smallBall.explode (hướng). Triển khai phương pháp có thể là

explode(int direction){//can be String 
    if(direction=NORTH) 
    y--; 
    //other condition checks 
} 

Phương pháp phát nổ sẽ bắt đầu thay đổi toạ độ x và y của chúng theo hướng truyền. Tôi hy vọng điều này sẽ cung cấp cho bạn một gợi ý về cách thực hiện nó.

+0

Cảm ơn. Tôi sẽ thử cách này và cho bạn biết. –

+0

Làm thế nào để gọi nổ liên tục, để làm cho SmallBall di chuyển? Ngoài ra một điều tôi đang thêm bóng vào FrameLayout, bây giờ làm thế nào tôi có thể thêm quả bóng nhỏ để bố trí đó sau khi gọi ball.setVisibility (View.GONE) ;. –

+0

Đặt trong phương thức onDraw() của smallBall và nếu có lệnh invalidate(), nó sẽ tự động gọi nó mỗi lần. Chỉ cần nhớ để có một cờ hoặc điều kiện boolean mà kích hoạt phát nổ() và dừng nó khi bạn muốn nó. – noob

0

Tất cả điều này đang xảy ra vì bạn không chỉ định LayoutParameters của đối tượng Ball. Điều gì xảy ra ở đây là khi bạn thêm một đối tượng Ball vào Bố cục, nó chiếm không gian của toàn bộ bố cục và đó là lý do tại sao nó phản ứng lại khi nhấp vào bất cứ nơi nào trên màn hình.

Bây giờ cho vấn đề thứ hai, lý do là như nhau. Giả sử tình hình của tấm, nó luôn luôn bật ra theo cách LIFO. Ở đây tất cả các đối tượng bóng bao gồm toàn bộ màn hình để xem xét chúng như tấm, vì vậy những gì bạn đang làm là đặt tấm trên đầu trang của eachother. Và đó là lý do tại sao nó phản ứng với phương pháp onClick của quả bóng cuối cùng đầu tiên và sau đó thứ hai cuối cùng và như vậy.

Vì vậy, cả hai vấn đề của bạn sẽ được giải quyết sau khi đặt thông số Bố cục phù hợp thành đối tượng Bóng.

+0

Tôi không nhận được quan điểm của bạn. Bạn có thể hiển thị một số mã ví dụ không? –

+0

@mark phần nào? –

1

OK, sự cố là khi tạo các đối tượng BallViewSmalBall làm đối tượng View. Tôi nghĩ rằng tôi hoàn toàn có thể giải thích điều này đủ tốt, vì vậy hãy chịu đựng với tôi:

Một nơi tốt để bắt đầu là với một lớp bánh. Hãy suy nghĩ về việc đứng trong nhà bếp và làm một chiếc bánh như thế này: thêm một lớp cùng một lúc. Đầu tiên là lớp sô cô la, và sau đó là lớp vani và sau đó là một lớp sô cô la khác. Nghe hay đấy? Ổn thỏa.

Vì vậy, có rất nhiều vòng tròn được vẽ trên một đối tượng Canvas và riêng biệt, Ball được thêm làm View s. Lưu ý Canvas chỉ đại diện cho hình chữ nhật mà người dùng có thể tương tác và được liên kết với một số View - mã số FrameLayout trong mã của bạn. Đối với tất cả ý định và mục đích, các Canvas hoàn toàn điền vào FrameLayout. Trong ứng dụng của bạn, Canvas là lớp dưới cùng của bánh-- điền cả chiều rộng và chiều cao của ContentView (hoặc pan).

Mỗi cuộc gọi đến m.addView(View v) được về cơ bản đặt một mới View v trên tuy nhiên nhiều View đối tượng đã được chứa trong m. Về bánh, mọi cuộc gọi đến addView đều thêm một lớp khác vào bánh lớp của chúng tôi.

Trong dự án của bạn, bạn muốn thêm một lớp vào bánh nhưng không để nó lấp đầy toàn bộ chảo. Bạn muốn đặt một vài dâu tây lên trên, bạn không muốn một lớp dâu tây đầy đủ.

Vì vậy, theo mặc định, các đối tượng BallView của bạn đang chiếm toàn bộ màn hình. Mỗi ngày đang chồng chất trên đầu trang tiếp theo, lấp đầy toàn bộ khung hình. Khi bạn nhấp vào, nó sẽ xóa ảnh cuối cùng-- vì ảnh cuối cùng ở trên cùng và đang chiếm chiều rộng và chiều cao của toàn bộ canvas-- và thực sự là chỉ mà người dùng có thể nhấp vào.

Vì vậy, bạn phải cho các đối tượng BallViewView của bạn có cùng kích thước với hình tròn bạn đang vẽ trên đối tượng Canvas.

Vì vậy, có một vài vấn đề ở đây:

Bạn chỉ có thể làm vị trí tuyệt đối với một RelativeLayout. Nếu bạn muốn BallView người dùng có thể nhấp vào ở trên cùng của vòng tròn được vẽ trên canvas, bạn cần một cách để cho biết BallView vị trí của nó và thay đổi vị trí đó theo cách động. Hiện tại bạn đang sử dụng FrameLayout, cần thiết cho Canvas - trong XML của bạn, hãy thêm toàn màn hình <RelativeLayout>. Và sau đó, trong mã của bạn, hãy thêm các đối tượng BallView vào số này RelativeLayout thay thế.

và sau đó, cuối cùng:

Go đây:

Set the absolute position of a view

Chúc may mắn!

+0

Thnaks. Đặt thông số bố cục sẽ giúp. Lời giải thích hay. –