Перехватывать живые обои Touch Events?

Если у меня есть действие, которое отображается над обоями пользователя, есть ли способ предотвратить получение обоими событий касания, которые я уже обработал? Возврат true или false из onTouchEvent, похоже, не имеет значения.


person j__m    schedule 11.03.2013    source источник


Ответы (1)


Я понял это!

private View empty;

@Override public void onCreate(Bundle savedState)
{
    super.onCreate(savedState);
    empty = new View(this);
    setContentView(empty);
}

@Override public void onAttachedToWindow()
{
    View topview = getLayoutInflater().inflate(R.layout.mylayout, null);
    PopupWindow pw = new PopupWindow(topview);
    pw.setWindowLayoutMode(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    pw.showAtLocation(empty, 0, 0, 0);
}

Основное понимание пришло из изучения исходного кода WindowManagerService .java; конкретно эта часть:

if (srcWin != null
    && pointer.getAction() == MotionEvent.ACTION_DOWN
    && mWallpaperTarget == srcWin
    && srcWin.mAttrs.type != WindowManager.LayoutParams.TYPE_KEYGUARD) {
        sendPointerToWallpaperLocked(relWin, pointer, eventTime);
}

Здесь есть четыре критерия, которые должны быть соблюдены, чтобы живые обои могли получать сенсорные события:

  1. srcWin (окно, предназначенное для получения касания) не должно быть нулевым. Я не знаю, когда эта проверка может дать сбой, но я думаю, можно с уверенностью предположить, что это не решение.
  2. Для выполнения этих проверок событие должно быть ACTION_DOWN. Другой код будет перенаправлять события касания на обои, не утруждая себя всеми этими проверками, если начальное нажатие уже было отправлено на обои. Тоже не решение.
  3. mWallpaperTarget, окно, под которым отображаются обои, должно быть равно srcWin, окну, для которого предназначено касание.
  4. Окно не должно быть защитным ограждением. Поскольку Android больше не позволяет несистемным приложениям использовать TYPE_KEYGUARD, это не решение.

Хитрость заключается в том, чтобы просто наложить еще одно окно сверху! Таким образом, теперь у нас есть стек окон в таком порядке:

  • обои окна
  • окно активности, mWallpaperTarget, которое имеет @android:style/Theme.Holo.Wallpaper.NoTitleBar или подобное.
  • srcWin, PopupWindow

Так как Android проверяет только строгое равенство и mWallpaperTarget != srcWin, касания не перенаправляются на обои, и взаимодействие не разрешено.

person j__m    schedule 12.04.2013