Android: прозрачный вид не справляется - PullRequest
2 голосов
/ 25 октября 2010

Я хочу иметь прозрачное представление над моим приложением.
Я хочу сделать это, просто зная текущее действие.
Я нашел способ сделать это, добавив новую структуру кадра через WindowManager, который я делаюthis:

public static void AddViewAbove(Activity activity) {
    FrameLayout newLayout = new FrameLayout(activity);

    WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
    LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT,
    WindowManager.LayoutParams.TYPE_APPLICATION,
    // if I let WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE   
    // then touchevent are passed to the application behind, but I cant handle touch in
    // my new frameLayout
    WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
    PixelFormat.TRANSLUCENT);
    activity.getWindowManager().addView(newLayout , lp);

}

Моя главная проблема сейчас заключается в том, что я не могу правильно получать touchevent в моем новом FrameLayout и в то же время в приложении за моим видом.

1 Ответ

2 голосов
/ 25 октября 2010

Еще не тестировали. Но идея в том, что вам нужно пройти через сенсорное событие вниз. Поскольку предполагается, что ваш верхний уровень (и фактически верхний) обрабатывал событие, вам может потребоваться установить прозрачную структуру кадра на НЕ для обработки события касания (и других событий, если применимо).

== Обновление ==

Вы должны унаследовать FrameLayout и создать свой собственный прозрачный макет. затем поручите ему отслеживать и обходить событие касания. Ссылка

Реализация этого метода для перехвата всех событий движения сенсорного экрана. Это позволяет вам наблюдать за событиями, когда они отправляются вашим детям, и в любой момент взять на себя ответственность за текущий жест. Использование этой функции требует некоторой осторожности, так как она имеет довольно сложное взаимодействие с View.onTouchEvent (MotionEvent), и для ее использования требуется правильно реализовать этот метод, а также этот. События будут приниматься в следующем порядке:

  1. Здесь вы получите событие «Даун».
  2. Событие down будет обработано либо дочерним элементом этой группы представлений, либо передано вашему собственному методу onTouchEvent () для обработки; это означает, что вы должны реализовать onTouchEvent () для возврата true, поэтому вы будете продолжать видеть остальную часть жеста (вместо того, чтобы искать родительское представление для его обработки). Кроме того, возвращая true из onTouchEvent (), вы не получите никаких следующих событий в onInterceptTouchEvent (), и вся обработка касания должна происходить в onTouchEvent (), как обычно.
  3. До тех пор, пока вы возвращаете false из этой функции, каждое последующее событие (вплоть до финала и включая его) будет сначала доставляться сюда, а затем в onTouchEvent () цели.
  4. Если вы вернете истину отсюда, вы не получите никаких следующих событий: целевое представление получит то же событие, но с действием ACTION_CANCEL, и все дальнейшие события будут доставлены в ваш метод onTouchEvent () и больше не будут появляться здесь ,

== UPDATE ==

Кстати, вы должны использовать свой пользовательский макет кадра (или другой подходящий вам макет), чтобы «держать» другого ребенка. Я предлагаю вам использовать это в качестве корневого макета.

...