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.
- Juego de Multitouch de Android
- Problemas con el joystick en pantalla de Android
- Android Multitouch - ¿Posible probar en el emulador?
- Multitouch para Android - Segundo dedo ACTION.MOVE Ignorado
- Android: ¿Cómo permitir sólo un toque?
¿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; }
- Custom textview con rotar, acercar, alejar y mover en el tacto en android?
- Cómo detectar el gesto de desplazamiento de la vista web con el zoom multitáctil habilitado con una aleta
- Obtener MotionEvent.getRawX / getRawY de otros punteros
- Dos dedos o pinc zoom a mapview en osmdroid
- Cómo realizar zoom in / out, rotación conjunta en Android
- Android: ¿cómo puedo verificar, que el dispositivo de apoyo multitouch?
- Multitouch para Android
- ¿Los dispositivos Android / webOS admiten eventos multi-touch de Javascript?
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.
- ¿Es posible escribir un receptor de difusión Android que detecte cuando el teléfono se despierta?
- Arrastrar y soltar sin eliminar del propietario