2011-02-18 10 views
9

Quiero hacer un botón de arrastrar y soltar. Arrástrelo hacia donde lo desea y se queda allí. A continuación, el código solo escala el botón, no cambia su posición.Cómo hacer clic y arrastrar el botón en 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; 
     } 

    }); 
} 
} 

Respuesta

6

Estoy trabajando en algo similar a esto. Aquí está el OnTouchListener que estoy 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 es la opinión de que usted está deseando pasar, en su caso, que le sustituya v con el botón. También tenga en cuenta que para que esto funcione, tuve que usar AbsoluteLayout como vista principal en mi archivo xml. Sé que está en desuso, pero me pareció más lógico usar eso que RelativeLayout y tratar de establecer los márgenes dinámicamente para mover la vista. La fórmula que utilicé para las nuevas posiciones xey busca hacer que la vista se centre en tu dedo mientras lo mueves. Pero no es del todo perfecto, dependiendo del tamaño de la vista, aún estará un poco descentrado con el dedo.

7

Sé que esta pregunta es un poco antigua, pero la encontré al intentar implementar arrastrar y soltar para un botón. Utilizando el método de FoamyGuy, pude hacer que el método de arrastrar y soltar funcionara con LinearLayout como vista principal estableciendo los márgenes de la vista en el método 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: Esto solo funciona si la vista que está arrastrando es la última vista en la jerarquía. De lo contrario, mueve todas las otras vistas en relación con la vista que está arrastrando.

+2

he intentado esto, pero a medida que me muevo, el botón/imag también está disminuyendo y volverse invisible. ¿Puede usted pls ayuda – png

+1

yo estaba usando el diseño relativo. esa fue la razón gracias – png

+0

También estoy usando el diseño relativo, por favor, ayúdame cómo conseguiste este –

1

Tal vez las respuestas deben ser mejorados, ya que esta cuestión es todavía muy prominente cuando buscas en Google fot it

Hoy en día hay un Framework que se puede usar para arrastrar y soltar. Fue introducido con Android 4.

Puede encontrar un buen tutorial en la página de desarrolladores de Google:
https://developer.android.com/guide/topics/ui/drag-drop.html

+1

Arrastrar y soltar el marco consiste en arrastrar datos entre vistas, no arrastrando vistas como en el OP. – Noumenon

Cuestiones relacionadas