OnTouchListener para toda la pantalla

Tengo una pantalla llena de botones, pero quiero que el método onTouch use las coordenadas de toda la pantalla. Primero intenté usar un RelativeLayout con un onTouchListener, pero nunca logré hacerlo "conectar" con el oyente (es decir, nada ocurrió cuando se tocó la pantalla), también intenté poner un ImageView en la parte superior de la pantalla, y luego hacer esta vista invisible .

Este último método dio respuestas correctas a onClicks, pero nunca logré hacerlo invisible.

Si esta es la mejor solución, que dudo mucho, ¿cómo puedo hacer que el ImageView totalmente invisible, sin perder su onTouchListener (he experimentado con white backgroundColor y setAlpha (0)).

¿Puedo de alguna manera hacer que el onTouchListener reaccione a toda la pantalla, usando coordenadas globales, mientras que la pantalla está mostrando (y alterando) varios botones (preferiblemente sin la imagen invisible)?

Si usted no entiende lo que estoy pidiendo, no dude en quejarse de eso. Voy a tratar de llenar los huecos, según sea necesario.

Editar:

Ahora he conseguido resolver el problema utilizando el método regular onTouch. Me encontré con varios problemas haciendo ACTION_DOWN y ACTION_MOVE activar los botones, pero finalmente conseguí que funcione. Para otras personas que lean esto: onInterceptTouchEvent podría ser utilizado (pero nunca he descubierto cómo obtener las coordenadas de pantalla en lugar de las coordenadas de vista).

Lo siento si estoy equivocado, pero creo que he tenido un problema similar. Yo quería una pantalla de título que muestra una imagen y en la imagen palabras que dicen "Haga clic para continuar" o algo similar. Me metí un poco y encontré que usted puede hacer un diseño de clic.

android:focusable="true" android:id="@+id/titlescreenframe"> 

Está en mi archivo xml para mi diseño. La imagen de fondo está simplemente en el atributo de fondo (me doy cuenta que no estás usando imágenes)

De todos modos, de vuelta en mi actividad

  private FrameLayout fl; ... fl = (FrameLayout)findViewById(R.id.titlescreenframe); fl.setOnClickListener(this); 

Y luego utilizo una instrucción switch para manejar eso y los botones que están en el siguiente layout. Aquí si lo necesita: Uso de la instrucción Switch para controlar los clics del botón

Parece que esto debería funcionar con otros diseños, así, y no tengo literalmente ninguna opinión sobre mi diseño principal. (A menos que el diseño sí mismo cuenta como uno?)

¡Decir ah! Sólo me di cuenta que dijiste que encontraste la solución. Momento tonto. Voy a publicar en la posibilidad de que esto ayuda a alguien, la codificación feliz de todo el mundo. 🙂

¿Has probado onInterceptTouchEvent en el diseño?

Utilicé dispatchTouchEvent para un problema similar. Usted podría considerarlo un reemplazo drop-in para onTouchEvent , excepto que siempre le envía un evento, incluso si se trata de una vista existente.

Devuelve true si estás manejando el evento, de lo contrario, asegúrate de llamar a super.dispatchTouchEvent() y devolver el resultado.

En cuanto a obtener coordenadas de pantalla – simplemente llame al getRawX de getRawX() y getRawY() lugar de getX() y getY() . Éstas son las coordenadas absolutas de la pantalla, incluyendo la barra de acción y todas. Si desea hacer una referencia cruzada a aquellos con vistas, getLocationOnScreen es probablemente la solución más fácil.

Toque regreso de evento a vistas de niño primero. Y si define onClick o onTouch listener para ellos, parnt view (por ejemplo, fragmento) no recibirá ningún oyente de contacto. Así que si quieres definir swipe listener para el fragmento en esta situación, debes implementarla en una nueva clase:

  package com.neganet.QRelations.fragments; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.FrameLayout; public class SwipeListenerFragment extends FrameLayout { private float x1,x2; static final int MIN_DISTANCE=150; private onSwipeEventDetected mSwipeDetectedListener; public SwipeListenerFragment(Context context) { super(context); } public SwipeListenerFragment(Context context, AttributeSet attrs) { super(context, attrs); } public SwipeListenerFragment(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { boolean result=false; switch(ev.getAction()) { case MotionEvent.ACTION_DOWN: x1 = ev.getX(); break; case MotionEvent.ACTION_UP: x2 = ev.getX(); float deltaX = x2 - x1; if (Math.abs(deltaX) > MIN_DISTANCE) { if(deltaX<0) { result=true; if(mSwipeDetectedListener!=null) mSwipeDetectedListener.swipeLeftDetected(); }else if(deltaX>0){ result=true; if(mSwipeDetectedListener!=null) mSwipeDetectedListener.swipeRightDetected(); } } break; } return result; } public interface onSwipeEventDetected { public void swipeLeftDetected(); public void swipeRightDetected(); } public void registerToSwipeEvents(onSwipeEventDetected listener) { this.mSwipeDetectedListener=listener; } } 

Puede hacer implementos para otros tipos de Layouts completamente de esta manera. Esta clase puede detectar tanto la derecha como la izquierda swipe y especialmente devuelve onInterceptTouchEvent true después de detectar. Es importante porque si no lo hacemos algunas veces las vistas de los niños quizás reciben el evento y tanto de Swipe para fragmento y onClick para la vista de niño (por ejemplo) se ejecuta y causa algunos problemas. Después de hacer esta clase, debe cambiar el archivo xml del fragmento:

  <com.neganet.QRelations.fragments.SwipeListenerFragment xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:id="@+id/main_list_layout" android:clickable="true" android:focusable="true" android:focusableInTouchMode="true" android:layout_height="match_parent" tools:context="com.neganet.QRelations.fragments.mainList" android:background="@color/main_frag_back"> <!-- TODO: Update blank fragment layout --> <android.support.v7.widget.RecyclerView android:id="@+id/farazList" android:scrollbars="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="left|center_vertical" /> </com.neganet.QRelations.fragments.SwipeListenerFragment> 

Usted ve que la etiqueta del comienzo es la clase que hicimos. Ahora en la clase de fragmento:

  View view=inflater.inflate(R.layout.fragment_main_list, container, false); SwipeListenerFragment tdView=(SwipeListenerFragment) view; tdView.registerToSwipeEvents(this); and then Implement SwipeListenerFragment.onSwipeEventDetected in it: @Override public void swipeLeftDetected() { Toast.makeText(getActivity(), "left", Toast.LENGTH_SHORT).show(); } @Override public void swipeRightDetected() { Toast.makeText(getActivity(), "right", Toast.LENGTH_SHORT).show(); } 

Es un poco complicado pero funciona perfecto 🙂

  • Llamar setHasOptionsMenu (true) de un fragmento da como resultado múltiples llamadas a onCreateOptionsMenu en Activity
  • Cómo cambiar el tamaño de AlertDialog en la pantalla del teclado
  • ¿Cómo utilizo las clases de "superficie" de Android?
  • Tabla de Donuts Android
  • Android View.OnKeyListener: haga clic una vez, ejecute dos veces
  • Cómo obtener un elemento de un niño en ExpandableListView?
  • ExpandableLists en Android, sólo quiero permitir que una lista de padres se expanda al mismo tiempo
  • Problema para agregar vista dinámicamente en Linearlayout
  • Establecer diferentes indicadores para diferentes grupos en android
  • WebViewClient no se puede resolver con un tipo
  • Android 4.1 webview javascript no funciona.
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.