2010-04-08 14 views
6

Sto lavorando su qualcosa che necessitava di funzionalità drag-and-drop personalizzate, quindi ho creato sottoclassi View, facendo un po 'di matematica in risposta agli eventi touch e quindi rendendo tutto manualmente attraverso codice sulla tela in onDraw. Ora, più funzionalità aggiungo, più il codice sta diventando fuori controllo e mi ritrovo a scrivere un codice molto più di quello che mi aspetto di scrivere in un ambiente di alto livello come Android.Drag and drop + disegno personalizzato su Android

È così che è stato eseguito o mi manca qualcosa? Se non sto facendo niente di fantasia nell'interfaccia utente, il framework gestisce la maggior parte delle mie interazioni. I controlli integrati gestiscono i tocchi e le trascinazioni e il mio codice è praticamente limitato alla logica e ai dati aziendali. C'è un modo per sfruttare la potenza di alcuni dei controlli dell'interfaccia utente e cose come le animazioni, eseguendone anche manualmente alcune nella tela di onDraw? C'è uno standard accettato su quando usare l'uno o l'altro (se davvero i due approcci possono essere mescolati)?

+0

Nel mio gioco ho sicuramente dovuto scrivere tonnellate di codice, matematica, controlli ecc. Quando gestivo quasi ogni tipo di animazione e interfacciamento tattile personalizzato. Forse ci sono modi più semplici, ma non sembra strano dover fare quel genere di cose. –

+0

cool ... apprezza il feedback. Stavo pensando di poter fare cose ibride funky usando un ViewGroup e mixando le mie viste personalizzate con altri elementi standard, ma non mi sembra davvero di passare il tempo a giocare con quella roba quando ho già un po 'di slancio andando alla lunga. – Rich

risposta

7

Uso il trascinamento della selezione nella mia applicazione di lettore musicale! Offro all'utente la possibilità di spostare una canzone da una playlist a un'altra playlist. È davvero bello e semplice per l'utente. Inizio l'evento di trascinamento per la mia vista quando l'utente fa un lungo tocco su una canzone o quando viene selezionata un'opzione da un menu! Questa è la mia classe:

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

}

Spero che questo vi aiuterà un po '.

Grazie!

+0

Mi piace questa idea. Proverò a implementare il drag and drop creando un RelativeLayout in cima alla mia vista e quindi intercettando il longtouch e lo spostamento. Immagino sia quello che stai facendo anche qui. Ottima idea per l'ispirazione! – Peterdk