android - programacion - Método onTouchEvent que no se llama
ontouchlistener android ejemplo (4)
ok, ahora estoy seguro de que el problema es que el control de scrollview toca, así que, de todos modos, ¿ignorar eso y ser el desplazamiento disponible?
Sí, ese es el problema, cuando Android maneja eventos táctiles, cada evento va de niño a padre, por lo que primero es manejado por ViewFlipper, pero luego va a ScrollView. Por lo tanto, debe implementar getParent (). RequestDisallowInterceptTouchEvent (true) (vea la clase ViewParent ) para que todos los eventos táctiles sean manejados por ViewFlipper, y luego simplemente detecte la dirección del gesto si es horizontal y luego voltear la vista si no, entonces pasar el evento táctil a ScrollView o simplemente desplazar ScrollView mediante programación
EDITAR: También puede implementar OnTouchListener en su ViewFlipper y en este oyente activar GestureDetector.onTouchEvent (evento), pero esto también requiere requestDisallowInterceptTouchEvent de su vista primaria establecida en true
Estoy teniendo un problema que mi método.
@Override
public boolean onTouchEvent(MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
se llama newer. ¿Alguna idea de por qué es así? Estoy creando una aplicación api 4.0.3 de google, y estoy tratando de habilitar swipes para mi viewFliper. Sin embargo, no puede funcionar si en el toque se llama más nuevo.
por cierto
public class MainActivity extends SherlockMapActivity implements ActionBar.TabListener {
Esa es la declaración de mi actividad. Y para detectar swipes he implementado eso:
SimpleOnGestureListener simpleOnGestureListener = new SimpleOnGestureListener(){
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {
float sensitvity = 50;
if((e1.getX() - e2.getX()) > sensitvity){
SwipeLeft();
}else if((e2.getX() - e1.getX()) > sensitvity){
SwipeRight();
}
return true;
}
};
GestureDetector gestureDetector= new GestureDetector(simpleOnGestureListener);
¡Gracias!
editar:
main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<ViewFlipper
android:id="@+id/ViewFlipper"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#ffffff" >
<include
android:layout_height="match_parent"
layout="@layout/mymain" />
<include layout="@layout/secondmain" />
<include layout="@layout/thirdmain" />
<include layout="@layout/fourthmain" />
</ViewFlipper>
</LinearLayout>
edit2: todos mis diseños incluidos tienen scrollview implementado, es posible que scroll tome esos eventos y los maneje. ¿Y cómo detectar gestos si es así?
Como escribí en los comentarios de la publicación de Gabrjan de que esto se dispara continuamente al tocar la pantalla, en realidad hay una manera fácil de obtener solo los eventos de toma de contacto:
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
System.out.println("TOUCH DOWN!");
//set immersive mode here, or whatever...
}
return super.dispatchTouchEvent(event);
}
Esto me fue muy útil para poner el Android en modo inmersivo cuando se tocaba cualquier parte de la pantalla, independientemente del elemento. ¡Pero no quise establecer el modo inmersivo repetidamente!
He encontrado una solución perfecta. Implementé un nuevo método:
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
View v = getCurrentFocus();
boolean ret = super.dispatchTouchEvent(event);
y ahora todo funciona bien!
Editar:
Mi código final:
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
View v = getCurrentFocus();
if (v instanceof EditText) {
View w = getCurrentFocus();
int scrcoords[] = new int[2];
w.getLocationOnScreen(scrcoords);
float x = event.getRawX() + w.getLeft() - scrcoords[0];
float y = event.getRawY() + w.getTop() - scrcoords[1];
if (event.getAction() == MotionEvent.ACTION_UP
&& (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w
.getBottom())) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindow().getCurrentFocus()
.getWindowToken(), 0);
}
}
boolean ret = super.dispatchTouchEvent(event);
return ret;
}
Todos los gestos y eventos táctiles van al elemento más bajo en la jerarquía de vista que puede manejarlo. Por lo tanto, si tiene algún oyente en el diseño incluido, puede llamar ((TypeOfParrent)yourView.getParent()).onTouchEvent(event)
para delegar el evento al controlador que desee.
AGREGAR: te recomiendo que uses ViewPager
para ViewPager
de vista. En el ViewPager no necesita implementar su propio onGestureListener.
http://developer.android.com/reference/android/support/v4/view/ViewPager.html