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.
- Cargar HTML estático en Webview
- Escala de diseño relativo personalizado?
- SetPivotX funciona extraño en la vista escalada
- Cómo traer una vista al frente sin llamar bringToFront ()?
- View.setEnabled (false) no funciona muy bien en android
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).
- Android: Obtener una vista Referencia a un elemento de menú
- Android Canvas.drawTextOnPath no parece correcto cuando la pintura se establece en Stroke
- ¿Rellenar ListFragments con una vista personalizada?
- Error al inflacionar la casilla de verificación
- Cómo agregar vistas dentro de una vista personalizada?
- Optimizaciones de Scrollview
- ¿Cuál es la diferencia entre getWidth / Height () y getMeasuredWidth / Height () en Android SDK?
- En un ExpandableListView, ¿cómo detectar el colapso del grupo?
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 🙂