2010-04-08 32 views
6

Estoy trabajando en algo que necesita una función personalizada de arrastrar y soltar, así que he estado subclasando la vista, haciendo un montón de cálculos en respuesta a eventos táctiles y luego renderizando todo de forma manual código en el lienzo en onDraw. Ahora, cuanta más funcionalidad agrego, más crece el código fuera de control y me encuentro escribiendo mucho más código de lo que esperaría escribir en un entorno de alto nivel como Android.Arrastrar y soltar + dibujo personalizado en Android

¿Es así como se hace, o me falta algo? Si no estoy haciendo nada sofisticado en la interfaz de usuario, el marco maneja la mayoría de mis interacciones. Los controles incorporados manejan los toques y arrastres, y mi código está bastante limitado a la lógica y datos de negocios. ¿Hay alguna manera de aprovechar el poder de algunos de los controles de la interfaz de usuario y cosas como las animaciones y al mismo tiempo hacerlo manualmente en el lienzo onDraw? ¿Existe un estándar aceptado de cuándo usar uno u otro (si de hecho los dos enfoques se pueden mezclar)?

+0

En mi juego, sin duda tuve que escribir toneladas de código, matemática, verificaciones, etc. al manejar casi cualquier tipo de animación e interfaz táctil personalizada. Tal vez hay formas más fáciles, pero no parecía inusual tener que hacer ese tipo de cosas. –

+0

genial ... agradezco los comentarios. Estaba pensando que puedo hacer cosas híbridas funky usando un ViewGroup y mezclando mis vistas dibujadas a medida con otros elementos estándar, pero realmente no tengo ganas de perder el tiempo para jugar con esas cosas cuando ya tengo un poco de impulso. yendo por el camino largo. – Rich

Respuesta

7

¡Uso el método de arrastrar y soltar en mi aplicación de reproductor de música! Doy al usuario la capacidad de mover una canción de una lista de reproducción a otra lista de reproducción. Es realmente agradable y simple para el usuario. ¡Comienzo el evento de arrastre para mi vista cuando el usuario hace 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 ayudará un poco.

Gracias!

+0

Me gusta esta idea. Voy a tratar de implementar arrastrar y soltar creando un RelativeLayout en la parte superior de mi vista, y luego interceptar el toque largo y moverme. Supongo que eso es lo que estás haciendo aquí también. ¡Gran idea para la inspiración! – Peterdk