Rileva quale vista il dito sta scorrendo in Android

Mentre questioni simili sono state sollecitate in passato non sembrano veramente risolte che potrebbero essere dovute alla confusione di ciò che viene chiesto.

Detto semplicemente, vorrei rilevare quale vista viene inserita mentre il dito scivola sullo schermo. Il migliore esempio di questo in azione è la tastiera soft su qualsiasi telefono Android. Quando si preme un tasto viene visualizzato come popup per indicare quale lettera è sotto il dito. Se ora sposta il dito sulla tastiera in un singolo gesto, le varie lettere si aprono mentre si passano le varie lettere dell'alfabeto.

  • Come hide la barra degli indirizzi di una pagina web in android?
  • Modifica dei dati di SimpleCursorAdapter
  • Tipo di carattere personalizzato nel titolo della scheda ActionBar
  • zoom sulla mappa Google google specificata
  • Android - BitmapFactory.decodeByteArray - OutOfMemoryError (OOM)
  • Imansible riavviare il servizio dopo l'uccisione nonostante sia in esecuzione in primo piano e con START_STICKY
  • Quale ascoltatore viene utilizzato per questo tipo di comportmento. Ho provato OnTouchListeners ma sembrano essere solo quando si tocca il button in contrapposizione al "dito passato"

    Button button = (Button)findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) {doStuff();} }); button.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { doStuff(); return false; } }); 

    OnFocusChangeListener non aiuta neanche.

  • come possiamo fare il layout della tabella per scorrere entrambi i modi (orizzontalmente, verticalmente)
  • La visualizzazione ListView personalizzata non risponde all'evento di clic
  • Android: per impostare un elemento selezionato quando si apre il ListView?
  • Convertire bitmap in seppia in android
  • android firebase device per messaggistica dispositivo
  • Come posso aggiungere più di 1 Views in una cella in TableRow?
  • 6 Solutions collect form web for “Rileva quale vista il dito sta scorrendo in Android”

    • creare un layout
    • aggiungere viste al tuo layout
    • impostare il setOnTouchListener nel layout
    • sovrascrivere il metodo onTouch con quanto segue:

       public boolean onTouch(View v, MotionEvent event) { LinearLayout layout = (LinearLayout)v; for(int i =0; i< layout.getChildCount(); i++) { View view = layout.getChildAt(i); Rect outRect = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()); if(outRect.contains((int)event.getX(), (int)event.getY())) { // over a View } } } 

    EDIT:

    Ho visto la tastiera. Immagino, è solo una vista e le coordinate di each lettera. Quindi è ansible calcolare facilmente quale lettera l'utente scorre

    E ORA LA RISPOSTA:

    Non sono sicuro, ma probabilmente questo codice aiuta il tuo.

    È così lontano, lo scrissi per me. Ma l'idea sta seguendo.

    Se ricordo bene, non c'è un detector gestito per le viste, ma puoi combinare il touchlistener della vista con il geturelistener della tua attività.

    Una volta che hai toccato la tua vista, hai

     private GestureDetector mGestureDetector; // x and y coordinates within our view private static float sideIndexX; private static float sideIndexY; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... mGestureDetector = new GestureDetector(this, new SideIndexGestureListener()); } class MyGestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // we know already coordinates of first touch // we know as well a scroll distance sideIndexX = sideIndexX - distanceX; sideIndexY = sideIndexY - distanceY; // when the user scrolls within our side index // we can show for every position in it a proper // item in the country list if (sideIndexX >= 0 && sideIndexY >= 0) { doStuff(); } return super.onScroll(e1, e2, distanceX, distanceY); } } button.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // now you know coordinates of touch // store them sideIndexX = event.getX(); sideIndexY = event.getY(); doStuff(); return false; } }); 

    Potresti voler provare GestureDetector .

    http://android-developers.blogspot.com/2010/06/making-sense-of-multitouch.html è orientato al multitouch, ma questo è un buon inizio per comprendere touch / gesti android, arresto successivo, doc / sample api

    La risposta semplice è che non puoi – non come l'iPhone quando si è in modalità accessibilità.

    Fino a Ice Cream Sandwich che è. Ora ha la capacità di iPhone di essere in grado di identificare gli elementi sotto il dito senza whererlo sollevare.

    È abbastanza diretto a gestire manualmente.

    Utilizzando il layout di padre come onTouchListener (nell'esempio seguente, extend un RelativeLayout ), è ansible verificare le collisioni tra un MotionEvent e il figlio View utilizzando una semplice logica di confronto di coordinate:

     /** Returns the View colliding with the TouchEvent. */ private final View getCollisionWith(final MotionEvent pMotionEvent) { // Declare the LocationBuffer. final int[] lLocationBuffer = new int[2]; // Iterate the children. for(int i = 0; i < this.getChildCount(); i++) { /** TODO: Order. */ // Fetch the child View. final View lView = this.getChildAt(i); // Fetch the View's location. lView.getLocationOnScreen(lLocationBuffer); // Is the View colliding? if(pMotionEvent.getRawX() > lLocationBuffer[0] && pMotionEvent.getRawX() < lLocationBuffer[0] + lView.getWidth() && pMotionEvent.getRawY() > lLocationBuffer[1] && pMotionEvent.getRawY() < lLocationBuffer[1] + lView.getHeight()) { // Return the colliding View. return lView; } } // We couldn't find a colliding View. return null; } 

    Le chiamate a getCollisionWith restituiranno View riferimenti che possono essere manipolati arbitrariamente.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.