2010-04-08 11 views
6

pracuję nad czymś, co potrzebne funkcjonalności niestandardowych przeciągnij i upuść, więc zostały instacji View, robi kilka matematyki w odpowiedzi na dotyk zdarzenia, a następnie renderowania wszystko ręcznie przez kod na płótnie w onDraw. Teraz, im więcej funkcji dodaję, tym bardziej kod wymyka się spod kontroli, a ja piszę o tonie więcej kodu, niż bym spodziewał się napisać w środowisku wysokiego poziomu, jak na przykład Android.przeciągnij i upuść + zwyczaj rysowania w Androidzie

Czy tak się stało, czy też czegoś brakuje? Jeśli nie robię nic nadzwyczajnego w interfejsie użytkownika, struktura obsługuje większość moich interakcji. Wbudowane kontrolki obsługują dotknięcia i przeciągnięcia, a mój kod ogranicza się do logiki biznesowej i danych. Czy istnieje sposób na wykorzystanie mocy niektórych elementów interfejsu użytkownika i animacji, a także wykonanie niektórych z nich ręcznie w obszarze roboczym OnDraw? Czy istnieje akceptowany standard, kiedy należy korzystać z jednego lub drugiego (jeśli rzeczywiście można mieszać oba podejścia)?

+0

W mojej grze z pewnością musiałem napisać mnóstwo kodu, matematyki, czeków itp. Podczas obsługi prawie każdego rodzaju animacji i niestandardowego interfejsu dotykowego. Być może istnieją łatwiejsze sposoby, ale nie wydaje się niezwykłe, aby robić takie rzeczy. –

+0

fajnie ... doceń opinie. Myślałem, że potrafię robić ostre rzeczy hybrydowe za pomocą ViewGroup i mieszanie moich niestandardowych widoków z innymi standardowymi elementami, ale nie mam ochoty spędzać czasu na zabawie z tymi rzeczami, gdy mam już odrobinę rozpędu. idąc długą drogą. – Rich

Odpowiedz

7

Używam przeciągnij i upuść w mojej aplikacji odtwarzacza muzyki! Daję użytkownikowi możliwość przeniesienia utworu z listy odtwarzania na inną listę odtwarzania. To jest naprawdę przyjemne i proste dla użytkownika. Uruchamiam zdarzenie przeciągania dla mojego widoku, gdy użytkownik wykonuje długie dotknięcie utworu lub gdy wybrana jest opcja z menu! To moja klasa:

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

}

Mam nadzieję, że to pomoże trochę.

Dzięki!

+0

Podoba mi się ten pomysł. Zamierzam spróbować wdrożyć przeciąganie i upuszczanie, tworząc RelativeLayout w górnej części mojego widoku, a następnie przechwytując longtouch i poruszając. Myślę, że to też tutaj robisz. Świetny pomysł na inspirację! – Peterdk