2010-04-08 17 views
6

Ich arbeite an etwas, das benutzerdefinierte Drag-and-Drop-Funktionalität benötigt, so habe ich View Subclassing, macht eine Reihe von Mathe in Reaktion auf Touch-Ereignisse, und dann Rendern alles manuell durch Code auf der Leinwand in OnDraw. Je mehr Funktionalität ich hinzufüge, desto mehr wächst der Code außer Kontrolle und ich schreibe eine Menge mehr Code, als ich normalerweise in einer High-Level-Umgebung wie Android schreiben würde.Ziehen und Ablegen + benutzerdefinierte Zeichnung in Android

Ist das so, oder fehlt mir etwas? Wenn ich in der Benutzeroberfläche nichts Besonderes mache, übernimmt das Framework den Großteil meiner Interaktionen. Integrierte Steuerelemente behandeln die Berührungen und ziehen sich, und mein Code ist ziemlich auf Geschäftslogik und Daten beschränkt. Gibt es eine Möglichkeit, die Leistung einiger UI-Steuerelemente und von Dingen wie Animationen zu nutzen, während Sie auch manuell etwas davon in der OnDraw-Zeichenfläche machen? Gibt es einen akzeptierten Standard wann der eine oder der andere zu verwenden ist (wenn die beiden Ansätze tatsächlich gemischt werden können)?

+0

In meinem Spiel musste ich Tonnen von Code, Mathe, Checks usw. schreiben, wenn ich mit fast jeder Art von Animation und benutzerdefinierten Touch-Interfaces umging. Vielleicht gibt es einfachere Wege, aber es schien nicht ungewöhnlich, so etwas tun zu müssen. –

+0

cool ... schätze die Rückmeldung. Ich dachte mir, dass ich funky Hybrid-Sachen machen kann, indem ich eine ViewGroup benutze und meine benutzerdefinierten Ansichten mit anderen Standardelementen mische, aber ich habe nicht wirklich Lust, Zeit mit diesen Sachen zu verbringen, wenn ich schon ein bisschen Schwung habe den langen Weg gehen. – Rich

Antwort

7

Ich benutze Drag & Drop in meiner Musik-Player-Anwendung! Ich gebe dem Benutzer die Möglichkeit, einen Titel von einer Wiedergabeliste in eine andere Wiedergabeliste zu verschieben. Es ist wirklich nett und einfach für den Benutzer. Ich starte das Drag-Ereignis für meine Ansicht, wenn der Benutzer einen Song lange tippt oder wenn eine Option aus einem Menü ausgewählt wird! 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 ein wenig helfen.

Danke!

+0

Ich mag diese Idee. Ich werde versuchen, drag and drop zu implementieren, indem ich ein RelativeLayout über meiner Ansicht erzeuge, und dann das Langtouch abfangen und verschieben. Ich schätze, das machst du auch hier. Tolle Idee zur Inspiration! – Peterdk

Verwandte Themen