Multitouch de Android! Hackear a alguien

Tengo que dejar este deslizamiento por ahora como una cuestión puramente académica, pero me gustaría mucho ver una solución en el tiempo cercano.

Debido a la forma en que Android maneja multitouch puede (como yo lo veo) sólo atrapar el evento en una sola vista. He intentado un hack para este envolver un diseño de contenedor que intercepta los eventos ve lo que ve que pertenece al ver las coords y cambiar la acción en sí para que parece al componente que es un evento de toque único. Yo compuso esos eventos y luego lo encaminé hacia las Vistas.

¿Alguien tiene una mejor idea para hacer esto?

Si alguien quiere el código para lo que he descrito anteriormente, sólo preguntar y lo publicar!

Diviértete y buena suerte: D JQCorreia

public class Container extends LinearLayout { LinkedHashMap<Integer,View> pointers = new LinkedHashMap<Integer,View>(); ArrayList<View> views = new ArrayList<View>(); public Container(Context context) { super(context); initialize(context); } public Container(Context context, AttributeSet attrs) { super(context, attrs); initialize(context); } private void initialize(Context context) { } @Override public void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); views = LayoutUtil.flattenLayout(this,false); for(View foo : views) { Rect rect = new Rect(); foo.getGlobalVisibleRect(rect); } } @Override public boolean onInterceptTouchEvent(MotionEvent event) { return true; } @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction() & MotionEvent.ACTION_MASK; if(action==MotionEvent.ACTION_DOWN) { for(View v: views) { Rect r = new Rect(); v.getGlobalVisibleRect(r); if (event.getX() > r.left && event.getX() < r.right && event.getY() > r.top && event.getY() < r.bottom) { pointers.put(event.getPointerId(0),v); pointers.get(event.getPointerId(0)).onTouchEvent(event); break; } } } if(action==MotionEvent.ACTION_POINTER_DOWN) { int pid = event.getAction() >> MotionEvent.ACTION_POINTER_ID_SHIFT; int index = event.findPointerIndex(pid); for(View v: views) { Rect r = new Rect(); v.getGlobalVisibleRect(r); if (event.getX(index) > r.left && event.getX(index) < r.right && event.getY(index) > r.top && event.getY(index) < r.bottom) { pointers.put(pid,v); MotionEvent copy = MotionEvent.obtain(event); copy.setAction(MotionEvent.ACTION_DOWN); copy.setLocation(event.getX(index), event.getY(index)); pointers.get(pid).onTouchEvent(copy); } } } if(action==MotionEvent.ACTION_POINTER_UP) { int pid = event.getAction() >> MotionEvent.ACTION_POINTER_ID_SHIFT; int index = event.findPointerIndex(pid); if(pointers.get(pid)!=null) // If the touch was outside any view { MotionEvent copy = MotionEvent.obtain(event); copy.setAction(MotionEvent.ACTION_UP); pointers.get(pid).onTouchEvent(copy); pointers.remove(pid); } } if(action==MotionEvent.ACTION_MOVE) { for(int i = 0; i<event.getPointerCount();i++) { int pid = event.getPointerId(i); MotionEvent copy = MotionEvent.obtain(event); copy.setLocation(event.getX(i), event.getY(i)); if(pointers.get(pid)==null) continue; // If the touch was outside any view pointers.get(pid).onTouchEvent(copy); } } if(action==MotionEvent.ACTION_UP) { if(pointers.get(event.getPointerId(0))!=null) { pointers.get(event.getPointerId(0)).onTouchEvent(event); pointers.remove(event.getPointerId(0)); } } return true; } } // This is the LayoutUtil.flattenLayout method public static ArrayList<View> flattenLayout(View view, boolean addViewGroups) { ArrayList<View> viewList = new ArrayList<View>(); if(view instanceof ViewGroup) { if(((ViewGroup)view).getChildCount()==0) viewList.add(view); else { if(addViewGroups) { viewList.add(view); } ViewGroup viewgroup = (ViewGroup) view; for(int i = 0; i < viewgroup.getChildCount();i++) { viewList.addAll(flattenLayout(viewgroup.getChildAt(i),false)); } } } else if(view instanceof View) { viewList.add(view); } return viewList; } 

La mejor solución aquí es poner

 android:splitMotionEvents = false 

Dentro de LinearLayout o cualquier Layout de su vista (Button, TextView, etc) es.

-cheers feliz codificaciones

Debe sustituir onInterceptTouchEvent también para capturar eventos de movimiento. Cuando devuelve true de onInterceptTouchEvent, todos los sucesos subsiguientes (ya sea dentro de los límites de su vista o no) se capturan en las llamadas a onTouchEvent hasta (e incluyendo) el punto en el que el último puntero sube.

Tradicionalmente, se pone suficiente lógica en onInterceptTouchEvent para determinar que un puntero ha descendido, Y que se ha movido más allá de algún umbral antes de devolver true, pero eso depende de si se desea soportar la función de arrastrar en las direcciones horizontal y / o vertical en las vistas principales. Si un evento ACTION_POINTER_DOWN es suficiente para activar la captura, puede devolver true inmediatamente.

  • ¿Cuál es el significado de un índice de puntero y de qué maneras puede ser cambiado?
  • ¿Hay una API incorporada para manejar la funcionalidad de pinch-zoom en Android
  • Multitouch para Android - Segundo dedo ACTION.MOVE Ignorado
  • Android Webview multitouch touchstart evento no funciona con más de 2 dedos
  • multitouch androide, el puntero de acción no funciona correctamente
  • Deshabilitar multi-touch en mi aplicación
  • Multitouch para Android
  • Juego de Multitouch de Android
  • Problemas con el joystick en pantalla de Android
  • Multitouch para Android obteniendo punteros erróneos y / o valores XY
  • Split Motion Events en android 2.3 y posterior
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.