vista subyacente rango android events touch

rango - Android: delegar el evento táctil a la vista subyacente



rango de vista revit (3)

Tengo la siguiente jerarquía: Activity -> PopupWindow -> CustomView

Mi PopupWindow sí es un cuadrado, pero transparente, por lo que puedes ver la Actividad en el fondo. El CustomView es un círculo incrustado dentro de PopupWindow.

Lo que he logrado hasta ahora es

  1. El usuario hace clic en el círculo verde e invoco "algunas cosas"
  2. El usuario hace clic fuera de PopupWindow y el evento táctil se envía a la Actividad.

La parte que falta es ahora, para enviar cualquier evento táctil que ocurra dentro de PopupWindow pero fuera de CustomView (círculo) a la Actividad.

Ya sé cómo sentir cuando el contacto está fuera de mi círculo. Solo tengo problemas para delegarlo a la Actividad.

En mi CustomView tengo lo siguiente en onTouch

if (radiusTouch > maxRadius) { return false; }

En mi PopupWindow ya configuré lo siguiente, pero nunca se llama:

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

¿Algo más que deba hacer para delegar el evento táctil en la Actividad?


Considere el 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;

Puede usar este código para actualizar las banderas de la ventana después de que se muestre la ventana emergente.

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);


Es una lástima que PopupWindow no sea una subclase de ViewGroup o incluso View. Entonces podría anular dispatchTouchEvent. ¿Puede modificar su vista personalizada para saber sobre PopupWindow y llamar a la función de descartar () cuando haya un clic fuera del círculo?


Intente configurar estos en su instancia de PopupWindow:

window.setBackgroundDrawable(new BitmapDrawable());

window.setOutsideTouchable(true);

y

window.setTouchable(true);

Esto es solo una sugerencia ... no la he probado. Déjame saber si funciona.

[Nota: Esto es para que onTouch () sea llamado en eventos táctiles ..]