Arrastrar y soltar + dibujo personalizado en Android

? Rich @ | Original: StackOverFlow

Estoy trabajando en algo que necesitaba funcionalidad personalizada de arrastrar y soltar, así que he estado subclasificación View, haciendo un montón de matemáticas en respuesta al tacto eventos, y luego haciendo todo manualmente a través de código en la lona en OnDraw . Ahora, más funcionalidad añado, más el código está creciendo fuera de control y me encuentro escribiendo una tonelada más código que yo esperaría a escribir en un entorno de alto nivel como Android.

¿Es así como se hace, o me estoy perdiendo algo? Si yo no estoy haciendo algo de fantasía en la interfaz de usuario, el marco se encarga de la mayoría de mis interacciones. Controles incorporados manejan los toques y arrastra, y mi código es más o menos limitados a la lógica de negocio y datos . ¿Hay una manera de aprovechar el poder de algunos de los controles de interfaz de usuario y cosas como animaciones al mismo tiempo haciendo algo de ella manualmente en el lienzo OnDraw ? ¿Existe una norma aceptada de cuando usar uno u otro ( si es que los dos enfoques pueden ser mixtos) ?

Top 5 Respuesta

1Ungureanu Liviu @

Yo uso de arrastrar y soltar en mi aplicación de reproducción de música ! Le doy a usuario la capacidad de mover una canción de un lista de reproducción a una lista de otro . Es muy bonito y sencillo para el usuario. Inicio el evento de arrastre para mi punto de vista cuando el usuario crea un toque largo en una canción o cuando se selecciona una opción de un menú !   Esta es mi clase :

package com.liviu.app.smpp.gui;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.liviu.app.smpp.R;
import com.liviu.app.smpp.listeners.CollisionListener;

public class SongItemView extends RelativeLayout implements OnClickListener {
// data
private String TAG = "SongItemView";
private Context context;
private LayoutInflater lInflater;   
private String title;
private int id;
private int maxHeight = 410;
private int mCurX;
private int mCurY;

//listeners
private CollisionListener onCollisionListener = null;

// views
private View v;

public SongItemView(Context ctx, String title_, int id_) {
    super(ctx);

    context   = ctx;
    lInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    v         = lInflater.inflate(R.layout.song_item_view, null);
    title     = title_;
    id        = id_;

    ((TextView)v.findViewById(R.id.siv_title)).setText(title);      

    addView(v, new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
}

@Override
public void onClick(View v) {
    Log.e(TAG, "clicked! " + ((TextView)v.findViewById(R.id.piv_title)).getText().toString());
}

public View getView(){
    return v;
}

public String getPlsName() {
    return title;
}

public int getID() {
    return id;
}

public void setTitle(String title_){
    ((TextView)v.findViewById(R.id.siv_title)).setText(title_);
    title = title_;
}

public void setID(int id_) {
    id = id_;   
}

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    mCurX = (int) event.getRawX();
    mCurY = (int) event.getRawY();

    int action = event.getAction();         

    if (action == MotionEvent.ACTION_MOVE) 
    {       
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);                     
        params.leftMargin = mCurX;
        params.topMargin  = mCurY;
        this.setLayoutParams(params);

        if(this.getTop() >= maxHeight)
        {
            Log.e(TAG, "Collision!!!!");
            if(onCollisionListener != null){
                    onCollisionListener.onCollision(this);                  
            }
        }                   
    }

    return true;
}

public void setOnCollisionListener(CollisionListener listener){
    onCollisionListener = listener;
}

public void setMaxHeight(int height){
    maxHeight = height;
}

public int getmCurX() {
    return mCurX;
}

public int getmCurY() {
    return mCurY;
}

public int getMaxHeight() {
    return maxHeight;
}

}

Espero que esto ayude un poco .

Thanks!