2011-02-18 21 views
9

Voglio fare un pulsante di trascinamento della selezione. Trascinalo dove vuoi che funzioni e rimane lì. Sotto il codice si ridimensiona solo il pulsante, non cambia la sua posizione.Come eseguire il pulsante di selezione e rilascio in Android

package com.dynamic; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.Button; 
import android.widget.FrameLayout; 
import android.widget.ImageView; 
import android.widget.TextView; 

import com.dynamic.R; 
import com.dynamic.R.layout; 


public class dy extends Activity { 
    int status; 
    private FrameLayout layout; 
    ImageView image; 
    Button b; 
    LayoutParams params; 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.frm); 
      final Button tv=(Button)findViewById(R.id.txt_birth); 
      tv.setDrawingCacheEnabled(true); 

      layout = (FrameLayout) findViewById(R.id.frm); 
      params = new LayoutParams(100,100); 


      params = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); 
      tv.setOnTouchListener(new View.OnTouchListener(){ 

     @Override 
     public boolean onTouch(View v, MotionEvent me) { 
      // TODO Auto-generated method stub 

      if (me.getAction() == MotionEvent.ACTION_DOWN) { 
       System.out.println("up"); 
       status = 0; 

      } 
      if (me.getAction() == MotionEvent.ACTION_UP) { 
       status = 1; 
       //Log.i("Drag", "Stopped Dragging"); 
      } else if (me.getAction() == MotionEvent.ACTION_MOVE) { 
       if (status == 0) { 
        System.out.println("Dragging"); 

        tv.setPadding((int) me.getRawX(), (int) me.getRawY(), 0, 0); 
       // b.setPadding(0,50,0,0); 
        tv.invalidate(); 

       } 
      } 
      return false; 
     } 

    }); 
} 
} 

risposta

6

sto lavorando a qualcosa di simile a questo. Ecco l'OnTouchListener che sto usando:

  myOnTouchListener = new OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent me){ 
      if (me.getAction() == MotionEvent.ACTION_DOWN){ 
       oldXvalue = me.getX(); 
       oldYvalue = me.getY(); 
       Log.i(myTag, "Action Down " + oldXvalue + "," + oldYvalue); 
      }else if (me.getAction() == MotionEvent.ACTION_MOVE ){ 
       LayoutParams params = new LayoutParams(v.getWidth(), v.getHeight(),(int)(me.getRawX() - (v.getWidth()/2)), (int)(me.getRawY() - (v.getHeight()))); 
       v.setLayoutParams(params); 
      } 
      return true; 
     } 
    }; 

v è la vista che si vogliono spostare, nel tuo caso si dovrebbe sostituire v con il pulsante. Si noti inoltre che per far funzionare tutto questo ho dovuto usare un AbsoluteLayout come vista genitore nel mio file xml. So che è deprecato ma è sembrato più logico utilizzarlo poi un RelativeLayout e provare a impostare i margini in modo dinamico per spostare la vista. La formula che ho usato per le nuove posizioni x e y cerca di far sì che la vista sia centrata sul dito mentre lo sposti. Ma non è proprio perfetto, a seconda delle dimensioni della vista sarà ancora un po 'fuori centro dal tuo dito.

7

So che questa domanda è un po 'vecchia, ma l'ho trovata quando ho provato a implementare il trascinamento della selezione per un pulsante. Usando il metodo di FoamyGuy sono stato in grado di ottenere il drag and drop per lavorare usando un LinearLayout come vista genitore impostando i margini della vista nel metodo onTouch.

dragBtn.setOnTouchListener(new View.OnTouchListener() { 

     public boolean onTouch(View v, MotionEvent me) { 
      if (me.getAction() == MotionEvent.ACTION_MOVE ){ 
       LayoutParams params = new LayoutParams(v.getWidth(), v.getHeight()); 
       //set the margins. Not sure why but multiplying the height by 1.5 seems to keep my finger centered on the button while it's moving 
       params.setMargins((int)me.getRawX() - v.getWidth()/2, (int)(me.getRawY() - v.getHeight()*1.5), (int)me.getRawX() - v.getWidth()/2, (int)(me.getRawY() - v.getHeight()*1.5)); 
       v.setLayoutParams(params); 
      } 
      return true; 
     } 
    }); 

NOTA: questo funziona solo se la vista che si sta trascinando è l'ultima vista nella gerarchia. Altrimenti sposta tutte le altre viste in relazione alla vista che stai trascinando.

+2

ho provato questo, ma come mi muovo, il pulsante/imag è anche diminuendo e diventare invisibili. Potete pls aiutare – png

+1

stavo usando il layout relativo. questa era la ragione. grazie – png

+0

Sto usando anche il layout relativo, per favore aiutami come hai ottenuto questo –

1

Forse le risposte dovrebbero essere migliorati, perché questa domanda è ancora molto importante quando si google fot it.

Oggi esiste un framework che può essere utilizzato per il trascinamento della selezione. E 'stato introdotto con Android 4.

È possibile trovare un bel tutorial alla pagina degli sviluppatori di Google:
https://developer.android.com/guide/topics/ui/drag-drop.html

+1

Il drag and drop framework riguarda il trascinamento dei dati tra le Viste, non trascinando le Visualizzazioni stesse come nell'OP. – Noumenon

Problemi correlati