ドラッグ&ドロップ+カスタムアンドロイドの描画

? Rich @ | Original: StackOverFlow

私は、カスタムのドラッグアンドドロップ機能を必要として何かに取り組んでいますので、私はタッチイベントに応答して、数学の束をやって、ビューをサブクラス化されており、その後のOnDrawでキャンバス上でコードを手動ですべてをレンダリングする。今、私は追加より多くの機能は、より多くのコードが制御不能に成長していると私は自分自身私はAndroidのようなハイレベルの環境で書くことを期待するよりも、トンより多くのコードを書く見つける。

それに行うのか、私は何かが足りない方法なのでしょうか?私はUIの空想何もしていないんだ場合は、フレームワークは私の相互作用の大部分を処理します。組み込みコントロールはタッチを処理し、ドラッグ、そして私のコードは、ほとんどのビジネスロジックとデータに限定されている。またOnDrawのキャンバスで手動でのいくつかをしながら、アニメーションのようなUIコントロールと事のいくつかの力を活用する方法はありますか? 1か一方を(実際に場合、2つのアプローチが混合することができる)を使用する際の受け入れられている標準はありますか?



Top 5 Respuesta

1Ungureanu Liviu @

私は私の音楽プレーヤアプリケーションにドラッグアンドドロップを使用する!私は、ユーザーに他のプレイリストにプレイリストから曲を移動する能力を与える。それは本当に素晴らしく、ユーザーのために簡単です。ユーザーが曲やメニューからオプションを選択した上で、長いタップを作るとき、私は私のビューのドラッグイベントを開始!   これは私のクラスです。

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

}

私は、これは少し役立つことを願っています。

Thanks!