2011-02-18 7 views
9

Chcę utworzyć przycisk przeciągania i upuszczania. Przeciągnij go tam, gdzie chcesz i pozostań tam. Poniższy kod skaluje przycisk, nie zmienia swojej pozycji.Jak zrobić przycisk Przeciągnij i upuść w Androidzie

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; 
     } 

    }); 
} 
} 

Odpowiedz

6

Pracuję nad czymś podobnym do tego. Oto OnTouchListener że używam:

  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 jest pogląd, że jesteś chcąc przenieść, w przypadku, gdy chcesz zastąpić V z przyciskiem. Zauważ też, że aby to działało, musiałem użyć AbsoluteLayout jako widoku nadrzędnego w moim pliku xml. Wiem, że jest przestarzałe, ale wydawało się bardziej logiczne, aby użyć tego, a następnie RelativeLayout i próbując ustawić marginesy dynamicznie, aby przesunąć widok. Formuła, której użyłem dla nowych pozycji x i y, stara się, aby widok był wyśrodkowany na palcu podczas jego przenoszenia. Ale nie jest do końca doskonały, w zależności od wielkości widoku nadal będzie trochę poza środkiem palca.

7

Wiem, że to pytanie jest trochę stare, ale znalazłem je podczas próby implementacji przeciągania i upuszczania dla przycisku. Używając metody FoamyGuy udało mi się przeciągnąć i upuścić do pracy używając LinearLayout jako widoku nadrzędnego, ustawiając marginesy widoku w metodzie 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; 
     } 
    }); 

UWAGA: Działa to tylko wtedy, gdy przeciągany widok jest ostatnim widokiem w hierarchii. W przeciwnym razie przesuwa wszystkie inne widoki w stosunku do widoku, który przeciągasz.

+2

próbowałem tego, ale jak się poruszać, przycisk/urojona jest też maleje i staje się niewidoczny. Czy potrafisz pomóc – png

+1

i korzystałem z układu względnego. to był powód. dziękuję – png

+0

Używam również układu względnego, proszę pomóż mi, jak masz to –

1

Być może odpowiedzi należy poprawić, ponieważ kwestia ta jest nadal bardzo widoczne, gdy google fot. to.

Obecnie istnieje struktura, która może być używana do przeciągania i upuszczania. Został on wprowadzony z Androidem 4.

można znaleźć ładny samouczek na stronie programisty Google:
https://developer.android.com/guide/topics/ui/drag-drop.html

+1

Struktura przeciągnij i upuść jest o przeciąganie danych między widokami, nie przeciągając widoki jak w OP. – Noumenon