Imposta l'ancoraggio personalizzato quando trascina una vista

Sto utilizzando l'API Android Drag & Drop e sto cercando di impostare l'ancoraggio dell'ombra di trascinamento al punto in cui il touch è stato fatto nella View . Il comportmento predefinito è quello di avere l'ancoraggio al centro della View .

Ho fatto alcune ricerche e sembra che questo possa essere fatto superando il onProvideShadowMetrics (Point shadowSize, Point shadowTouchPoint) nella class DragShadowBuilder . Da quello che ho capito, se cambiamo le coordinate x, y di shadowTouchPoint , shadowTouchPoint modificare le coordinate dell'ancoraggio di trascinamento.

  • Peer Android non autenticato
  • Creazione di un connettore Https con il certificato lato client da PKCS # 10 con SpongyCastle
  • Come impostare la data minima DatePicker alla data corrente
  • dual sim android sdk
  • Android AlarmManager e la domanda di servizio
  • C'è un modo per determinare l'altezza dello schermo fisico android in cm o pollici?
  • Quello che ho fatto è stato estendere la class DragShadowBuilder come così:

     class EventDragShadowBuilder extends DragShadowBuilder { int touchPointXCoord, touchPointYCoord; public EventDragShadowBuilder() { super(); } public EventDragShadowBuilder(View view, int touchPointXCoord, int touchPointYCoord) { super(view); this.touchPointXCoord = touchPointXCoord; this.touchPointYCoord = touchPointYCoord; } @Override public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) { shadowTouchPoint.set(touchPointXCoord, touchPointYCoord); super.onProvideShadowMetrics(shadowSize, shadowTouchPoint); } } 

    Nel Fragment where utilizzo drag & drop ho creato due ascoltatori per avviare un evento di trascinamento per una View :

     mEventLongClickListener = new OnLongClickListener() { @Override public boolean onLongClick(View view) { EventDragShadowBuilder shadowBuilder = new EventDragShadowBuilder( view, mEventTouchXCoord, mEventTouchYCoord); view.startDrag(null, shadowBuilder, view, 0); return true; } }; // We need this listener in order to get the corect coordinates for the // drag shadow mEventTouchListener = new OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent event) { final int action = event.getAction(); switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: { mEventTouchXCoord = (int) event.getX(); mEventTouchYCoord = (int) event.getY(); break; } } return false; } }; 

    E ho impostato gli ascoltatori:

     itemView.setOnLongClickListener(mEventLongClickListener); itemView.setOnTouchListener(mEventTouchListener); 

    Tutto ok fino a qui. Ma quando provo l'applicazione e avviare il process di trascinamento, l'ombra di trascinamento è centrata nel punto di touch. Quindi usa il comportmento predefinito. Ho provato a eseguire il debug e vedo che mEventTouchXCoord e mEventTouchYCoord sono impostati correttamente. Il metodo shadowTouchPoint.set(touchPointXCoord, touchPointYCoord); ottiene le coordinate corrette ma comunque centra l'ombra.

    Non so cosa faccio male. Forse ho frainteso l'API. Qualsiasi aiuto con o suggerimento sarebbe molto apprezzato.

  • Disabilita l'input di tastiera dura per EditText in Android
  • Android: mescolare più istanze di AudioTrack?
  • Emulatore Android: Imansible avviare la webcam per catturare l'image in emulatore
  • Come impostare lo stile del text selezionato utilizzando il carattere personalizzato tramite il metodo spannable
  • Chiamare API nascosta in android per distriggersre lo schermo
  • Come apri un progetto Android Studio in Eclipse?
  • 2 Solutions collect form web for “Imposta l'ancoraggio personalizzato quando trascina una vista”

    Ok, così come Scoup ha affermato che il problema era nel metodo onProvideShadowMetrics() . Il fatto è che, se super.onProvideShadowMetrics(shadowSize, shadowTouchPoint); il super constructor, super.onProvideShadowMetrics(shadowSize, shadowTouchPoint); , non mostrerà più l'ombra di trascinamento.

    Guardando più da vicino il metodo API questo è ciò che ho trovato:

     public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) { final View view = mView.get(); if (view != null) { shadowSize.set(view.getWidth(), view.getHeight()); shadowTouchPoint.set(shadowSize.x / 2, shadowSize.y / 2); } else { Log.e(View.VIEW_LOG_TAG, "Asked for drag thumb metrics but no view"); } } 

    Così effettivamente, ripristina l' shadowTouchPoint al centro della View trascinata. Ma anche inizializza l'ombra di trascinamento alle size corrette. Mentre voglio che le size dell'ombra di trascinamento siano impostate correttamente, non voglio ripristinare shadowTouchPoint .

    Il modo più semplice per get questo è quello di call il constructor super prima di inizializzare l' shadowTouchPoint con i valori personalizzati, come:

     @Override public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) { super.onProvideShadowMetrics(shadowSize, shadowTouchPoint); shadowTouchPoint.set(touchPointXCoord, touchPointYCoord); } 

    Un'altra soluzione è quella di affrontare l'ombra di trascinamento. View te stesso e saltare totalmente il super-constructor. Tornerò con un aggiornamento dettagliato.

    Immagino che il problema è questa linea super.onProvideShadowMetrics(shadowSize, shadowTouchPoint);

    Hai già modificato il valore di shadowTouchPoint in shadowTouchPoint.set(touchPointXCoord, touchPointYCoord); ma quando chiamate il super, passate l'shadowTouchPoint che viene sostituito con il metodo predefinito "super" e il comportmento predefinito è il centro di shadowTouchPoint.

    Quindi, rimuovi questa linea.

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