2012-11-08 24 views
7

"Lượt hình chữ nhật trong tọa độ của cha mẹ". Nhưng điều đó có nghĩa gì?Định nghĩa của giá trị được cung cấp bởi chức năng Android View.getHitRect() là gì?

Để khuếch đại, điều tôi thực sự muốn biết là ý nghĩa của cụm từ "hình chữ nhật nhấn". Nó là gì? Làm thế nào để khuôn khổ xử lý nó? Khi trong vòng đời là giá trị trả về có ý nghĩa? Hình dạng khác với hình chữ nhật được xác định bởi getLeft(), getTop(), getRight(), getBottom()?

Dựa vào tên hàm tôi có thể đoán được câu trả lời và thử một vài ví dụ, nhưng điều đó không thỏa đáng. Tôi không thể tìm thấy gì hữu ích về chức năng này trên trang web của Nhà phát triển Android hoặc bất kỳ nơi nào khác mà tôi đã xem.

Trả lời

4

Here dường như là giải thích đầy đủ nhất.

Phương thức getHitRect() nhận hình chữ nhật chạm của trẻ (có thể chạm vào khu vực) trong tọa độ của cha mẹ.

Đoạn ví dụ sử dụng hàm để xác định khu vực có thể sờ hiện tại của một cái nhìn con (sau khi bố trí) để có hiệu quả mở rộng nó bằng cách tạo ra một TouchDelegate

0

Các Rect được trả về chứa 4 giá trị:

  • đáy
  • trái
  • đúng
  • đầu

bottom xác định tọa độ y của đáy của hình chữ nhật. left chỉ định tọa độ x của cạnh trái của hình chữ nhật. v.v.

Tọa độ gốc có nghĩa là giá trị hình chữ nhật nhấn được xác định trong hệ tọa độ của cha mẹ.

Hãy tưởng tượng mình đang đứng trong một cánh đồng mở vào ban đêm, nhìn lên mặt trăng. Vị trí của bạn trên trái đất có thể được diễn tả theo nhiều cách.

Nếu chúng tôi thể hiện vị trí của bạn trong hệ tọa độ địa phương, bạn sẽ được đặt tại (vĩ độ/kinh độ) (0, 0). Khi bạn đi bộ xung quanh, hệ thống tọa độ địa phương của bạn không bao giờ thay đổi, bạn luôn được đặt ở giữa (0,0) trong hệ tọa độ địa phương của bạn.

Tuy nhiên, nếu chúng tôi thể hiện vị trí của bạn bằng hệ tọa độ của trái đất, bạn có thể ở (vĩ độ, kinh độ) (16, 135).

Bạn đang đứng trên trái đất, vì vậy trái đất là hệ thống tọa độ gốc của bạn.

Trong cùng một cách, Chế độ xem có thể được chứa trong LinearLayout. LinearLayout sẽ là cha của View và do đó các giá trị từ getHitRect() sẽ được thể hiện trong hệ tọa độ của LinearLayout.

EDIT

Về generic hit hình chữ nhật là một thuật ngữ dùng để xác định một vùng hình chữ nhật được sử dụng để phát hiện va chạm. Trong điều khoản của Android, một hình chữ nhật hit chỉ là một thể hiện của loại Rect.

Các phương thức getLeft() v.v. chỉ là những người truy cập dữ liệu trong Rect, vì vậy các thành viên của Rect xác định cùng một hình chữ nhật mà bạn sẽ nhận được bằng cách gọi các phương thức.

Một kịch bản sử dụng phổ biến cho một hình chữ nhật sẽ được xử lý tap sự kiện:

//Imagine you have some Rect named myRect 
//And some tap event named event 
//Check if the tap event was inside the rectangle 
if(myRect.contains(event.getX(), event.getY()){ 
    //it's a hit! 
} 

Bạn cũng có thể muốn xem nếu hai hình chữ nhật của cắt nhau

if(myRect.contains(myRect2)){ 
    //collision! 
} 

Đối với một View, hình chữ nhật hit không thực sự được sử dụng trực tiếp, bạn có thể see the source. Trên cùng, dưới, bên trái, bên phải được sử dụng một tấn trong View nhưng phương thức getHitRect() thực sự thuận tiện hơn để truyền lại các tham số đó (trên/dưới/trái/phải) cho những người cần chúng trong một gói gọn gàng.

+0

Cảm ơn, vui lòng xem chỉnh sửa của tôi. – JulianSymes

+1

Cảm ơn bạn đã chỉnh sửa, nhưng tôi e là nó đặt ra câu hỏi một chút. Mã bạn trỏ đến chỉ ra rằng getHitRect() đôi khi trả về hình chữ nhật được xác định bởi getLeft(), getTop(), vv nhưng không phải lúc nào. Vậy sự khác biệt là gì? Những gì tôi đặc biệt yêu cầu là chính xác hình chữ nhật hàm trả về, trong các thuật ngữ ngữ nghĩa có ý nghĩa. Bạn sẽ đánh giá cao rằng chức năng có giá trị nhỏ mà không có câu trả lời chính xác. Tôi kết luận rằng khi tài liệu của hàm chỉ định không có hành vi thì không có hành vi nào được đảm bảo, vì vậy nó không hiệu quả. Tôi sẽ tránh nó. – JulianSymes

1

Họ chắc chắn phải làm một công việc tốt hơn về tài liệu. Nếu bạn nhìn vào nguồn View#getHitRect(Rect), bạn sẽ thấy rằng nếu chế độ xem có "ma trận nhận dạng" hoặc không được đính kèm với cửa sổ, nó sẽ trả về chính xác những gì chúng tôi đang nghĩ. Nhánh thay thế có nghĩa là khung nhìn có biến đổi, do đó để có được 'hit rect' cho cha, là rect nhỏ nhất có thể trong hệ tọa độ của nó bao gồm view, bạn phải di chuyển rect đến gốc, chạy biến đổi và sau đó thêm lại vị trí ban đầu của nó.

Vì vậy, bạn có thể sử dụng nó làm lối tắt cho mục đích này nếu không có biến đổi. Nếu có một biến đổi, hãy nhớ rằng bạn sẽ nhận được các giá trị trong rect có thể ở bên ngoài hoặc bên trong khung nhìn như hiện đang được hiển thị.

Các vấn đề liên quan