2010-09-30 26 views
21

tôi có hệ thống phân cấp như sau: Activity ->PopupWindow ->CustomViewAndroid: ủy sự kiện cảm ứng để xem underlaying

My các PopupWindow chính nó là một hình vuông, nhưng trong suốt, vì vậy bạn sẽ nhìn thấy Hoạt động ngồi ở chế độ nền. CustomView là một vòng tròn được nhúng bên trong PopupWindow. alt text

Những gì tôi đã đạt được cho đến nay là

  1. Người dùng nhấp vào vòng tròn màu xanh lá cây và tôi gọi "một số nội dung"
  2. Người dùng nhấp chuột bên ngoài của PopupWindow và sự kiện liên lạc được cử đến các hoạt động.

Phần còn thiếu bây giờ, gửi bất kỳ sự kiện chạm nào xảy ra bên trong PopupWindow nhưng bên ngoài CustomView (vòng tròn) vào Hoạt động.

Tôi đã biết cách cảm nhận khi chạm ngoài vòng tròn của tôi. Tôi chỉ gặp sự cố khi ủy quyền nó cho Hoạt động.

Trong CustomView của tôi, tôi đã điều sau đây trong onTouch

if (radiusTouch > maxRadius) { 
    return false; 
} 

Trong PopupWindow tôi đã thiết lập của tôi như sau, nhưng nó được không bao giờ được gọi là:

popup.setTouchInterceptor(new OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     Log.i(TAG, "PopupWindow :: onTouch()"); 
     return false; 
    } 
}); 

Bất cứ điều gì khác tôi phải làm gì để ủy sự kiện cảm ứng tất cả các cách để hoạt động?

+3

Bạn đã tạo mô hình đó như thế nào?nó khá trơn tru – browep

+1

Làm thế nào bạn quản lý để gửi các sự kiện bấm vào các khung nhìn bên dưới PopUpWindow? – Mannaz

+1

Mocups đã được thực hiện bởi malsups balsamic http://balsamiq.com/products/mockups/ –

Trả lời

0

Thật quá tệ khi PopupWindow không phải là phân lớp của ViewGroup hoặc thậm chí Xem. Sau đó, bạn có thể ghi đè dispatchTouchEvent. Bạn có thể sửa đổi chế độ xem tùy chỉnh của mình để biết về PopupWindow và bỏ qua cuộc gọi() trên đó khi có nhấp chuột bên ngoài vòng kết nối không?

12

Xem xét FLAG_NOT_TOUCH_MODAL:

/** Window flag: Even when this window is focusable (its 
    * {@link #FLAG_NOT_FOCUSABLE is not set), allow any pointer events 
    * outside of the window to be sent to the windows behind it. Otherwise 
    * it will consume all pointer events itself, regardless of whether they 
    * are inside of the window. */ 
public static final int FLAG_NOT_TOUCH_MODAL = 0x00000020; 

Bạn có thể sử dụng mã này để upate cờ sổ sau các cửa sổ popup được hiển thị.

FrameLayout popupContainer = (FrameLayout)contentView.getParent(); 
WindowManager.LayoutParams p = (WindowManager.LayoutParams)popupContainer.getLayoutParams(); 
p.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; 
WindowManager windowManager = (WindowManager)getSystemService(Context.WINDOW_SERVICE); 
windowManager.updateViewLayout(popupContainer, p); 
+0

Ok. Nó hoạt động. Tôi có thể chạm vào cả hai chế độ xem bên trong chế độ xem 'popupWindow' và hoạt động. Chỉ 'updateViewLayout (contentView, p)', không có 'contentView.getParent()' – Yeung

3

Cố gắng thiết lập những ngày dụ PopupWindow của bạn:

window.setBackgroundDrawable(new BitmapDrawable());

window.setOutsideTouchable(true);

window.setTouchable(true);

Đây chỉ là một gợi ý ... Tôi có không thử nghiệm nó. Hãy cho tôi biết nếu nó hoạt động.

[Lưu ý: Điều này dành cho onTouch() để nhận các sự kiện liên lạc ..]

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