Drag & Drop + benutzerdefinierte Zeichnen in Android

? Rich @ | Original: StackOverFlow

Ich bin auf etwas, das benutzerdefinierte Drag-and- Drop-Funktionalität benötigt arbeiten, so habe ich Unterklassen ansehen, tun eine Menge Mathematik als Reaktion auf Ereignisse zu berühren, und dann ist alles manuell machen durch den Code auf der Leinwand in OnDraw . Nun, die mehr Funktionalität, die ich hinzufügen, desto mehr wird der Code unkontrolliert zu wachsen und ich finde mich schriftlich eine Tonne mehr Code als ich erwarten würde, in einer hohen Umwelt wie Android zu schreiben.

Ist dies, wie es gemacht wird, oder bin ich etwas fehlt ? Wenn ich nicht etwas Phantasie in der Benutzeroberfläche zu tun, das Framework übernimmt die Mehrheit meiner Interaktionen. Integrierte Steuerungen verarbeiten die berührt und zieht, und mein Code ist ziemlich viel, um Geschäftslogik und Daten beschränkt. Gibt es eine Möglichkeit, die Macht der einige der UI-Steuerelemente und Dinge wie Animationen nutzen und gleichzeitig auch manuell in der OnDraw Leinwand tut etwas davon ? Gibt es ein akzeptierter Standard, wann man die eine oder andere ( wenn in der Tat die beiden Ansätze auch gemischt) verwenden ?

Top 5 Antwort

1Ungureanu Liviu @

Ich per Drag & Drop in meiner Musik -Player-Anwendung ! Ich gebe zu Benutzer die Möglichkeit, einen Song aus einer Playliste in eine andere Wiedergabeliste verschieben. Es ist wirklich schön und einfach für den Anwender. Ich starte den Ziehereignis für meine Ansicht, wenn der Benutzer machen eine lange tippen auf ein Lied oder wenn eine Option aus einem Menü ausgewählt wurde !   Das ist meine Klasse :

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

}

Ich hoffe, das wird ein bisschen helfen.

Thanks!