2010-04-08 19 views
6

Özel sürükle ve bırak işlevine ihtiyaç duyan bir şey üzerinde çalışıyorum, bu yüzden alt sınıflara bakıyorum, etkinliklere yanıt olarak bir grup matematik yapıyor ve sonra her şeyi el ile oluşturuyor onDraw'daki tuvalde kod. Şimdi, daha fazla işlevsellik eklediğimde, kod daha fazla kontrolden çıkıyor ve kendimi Android gibi üst düzey bir ortamda yazmayı beklediğimden çok daha fazla kod yazıyor.Sürükle ve bırak + özel çizim Android

Bu nasıl bitti, yoksa bir şey mi eksik? Kullanıcı arayüzünde fantezi bir şey yapmazsam, çerçeve etkileşimlerimin çoğunu ele alır. Yerleşik kontroller dokunuşları ve sürüklemeleri işliyor ve kodum iş mantığı ve verilerle sınırlı. Bazı UI kontrolleri ve animasyonlar gibi şeylerin gücünü güçlendirmenin bir yolu var mı? Birini veya diğerini ne zaman kullanacağımızın kabul edilmiş bir standardı var mı (gerçekten de iki yaklaşım karışabilirse)?

+0

Oyunumda neredeyse her tür animasyon ve özel dokunmatik arayüzle çalışırken kesinlikle kod, matematik, çek vb. Yazmak zorunda kaldım. Belki de daha kolay yollar vardır, ama bu tür bir şey yapmak zorunda olması alışılmadık görünmüyordu. –

+0

havalı ... geri bildirim için teşekkür ederiz. Bir ViewGroup kullanarak ve özel çizilen görünümlerimi diğer standart öğelerle karıştırarak eğlenceli melez şeyler yapabileceğimi düşünüyordum, ama gerçekten biraz momentum yaşadığım zamanlar ile uğraşmak için zaman harcamayı gerçekten istemiyorum. uzun yoldan gidiyor. – Rich

cevap

7

Müzik çalar uygulamasında sürükle ve bırak özelliğini kullanıyorum! Bir şarkıyı bir şarkı listesinden başka bir çalma listesine taşımayı beceririm. Bu kullanıcı için gerçekten güzel ve basit. Kullanıcı bir şarkıya uzun bir tıklama yaptığında veya menüden bir seçenek seçildiğinde, görünümüm için sürükleme olayını başlatıyorum! Bu benim sınıftır:

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

}

Bu biraz yardımcı olacağını umuyoruz.

Teşekkürler!

+0

Bu fikri beğeniyorum. Görünümümün üstünde bir RelativeLayout oluşturarak sürükle ve bırak uygulamasını deneyeceğim ve sonra longtouch'u yakalayıp taşıyacağım. Sanırım burada da böyle yapıyorsun. İlham almak için harika bir fikir! – Peterdk