2010-09-30 3 views
21

У меня есть следующая иерархия: Activity ->PopupWindow ->CustomViewAndroid: делегировать сенсорное событие нижележащего зрения

Моего сам PopupWindow представляет собой квадрат, но прозрачный, так что вы можете видеть активность, сидя в фоновом режиме. CustomView - это круг, встроенный внутри PopupWindow. alt text

То, что я достиг до сих пор

  1. пользователь нажимает на зеленый круг, и я призываю «некоторые вещи»
  2. пользователь щелкает за пределами PopupWindow и сенсорный событие получает отправляется на операцию.

Недостающая часть в настоящее время, чтобы послать любое касание событие, которое происходит внутри PopupWindow но вне CustomView (окружности) к деятельности.

Я уже знаю, как чувствовать, когда прикосновение находится вне моего круга. У меня просто проблемы, делегирующие его активности.

В моей CustomView я следующее onTouch

if (radiusTouch > maxRadius) { 
    return false; 
} 

В моей PopupWindow я уже настроить следующее, но он не получает не называли:

popup.setTouchInterceptor(new OnTouchListener() { 

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

Что еще я должен сделать, чтобы делегировать событие касания вплоть до Activity?

+3

, как вы создали этот макет?это довольно slick – browep

+1

Как вам удалось отправить события кликов в представления под PopUpWindow? – Mannaz

+1

Mocups сделаны бальзамическими макетами http://balsamiq.com/products/mockups/ –

ответ

0

Слишком плохо, что PopupWindow не является подклассом ViewGroup или даже View. Тогда вы можете переопределить dispatchTouchEvent. Можете ли вы изменить свой собственный вид, чтобы узнать о PopupWindow и вызвать функцию увольнения(), когда есть клик за пределами круга?

12

Рассмотрим 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; 

Вы можете использовать этот код для upate флаги окна после было показано всплывающее окно.

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

Хорошо. Оно работает. Я могу коснуться обоих представлений внутри 'popupWindow' и видов деятельности. Просто 'updateViewLayout (contentView, p)', no 'contentView.getParent()' – Yeung

3

установки их на вашем PopupWindow например Try:

window.setBackgroundDrawable(new BitmapDrawable());

window.setOutsideTouchable(true);

и

window.setTouchable(true);

Это просто предложение ... У меня есть не проверял его. Сообщите мне, если это работает.

[Примечание: Это для onTouch(), чтобы получить призвали сенсорные события ..]

Смежные вопросы