Если у меня есть действие, которое отображается над обоями пользователя, есть ли способ предотвратить получение обоими событий касания, которые я уже обработал? Возврат true или false из onTouchEvent, похоже, не имеет значения.
Перехватывать живые обои Touch Events?
Ответы (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);
}
Здесь есть четыре критерия, которые должны быть соблюдены, чтобы живые обои могли получать сенсорные события:
srcWin
(окно, предназначенное для получения касания) не должно быть нулевым. Я не знаю, когда эта проверка может дать сбой, но я думаю, можно с уверенностью предположить, что это не решение.- Для выполнения этих проверок событие должно быть
ACTION_DOWN
. Другой код будет перенаправлять события касания на обои, не утруждая себя всеми этими проверками, если начальное нажатие уже было отправлено на обои. Тоже не решение. mWallpaperTarget
, окно, под которым отображаются обои, должно быть равноsrcWin
, окну, для которого предназначено касание.- Окно не должно быть защитным ограждением. Поскольку Android больше не позволяет несистемным приложениям использовать
TYPE_KEYGUARD
, это не решение.
Хитрость заключается в том, чтобы просто наложить еще одно окно сверху! Таким образом, теперь у нас есть стек окон в таком порядке:
- обои окна
- окно активности,
mWallpaperTarget
, которое имеет@android:style/Theme.Holo.Wallpaper.NoTitleBar
или подобное. srcWin
,PopupWindow
Так как Android проверяет только строгое равенство и mWallpaperTarget
!= srcWin
, касания не перенаправляются на обои, и взаимодействие не разрешено.
person
j__m
schedule
12.04.2013