2013年2月21日木曜日

DragDrop

Drag & Drop をとりあえず試作。

MainActivity.java
 
public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  
    RelativeLayout root = (RelativeLayout) findViewById(R.id.root);
    DragDropListener listener = new DragDropListener(this, root);
  
    ImageView iv = (ImageView)findViewById(R.id.icon);
    iv.setOnLongClickListener(listener);
    // iv.setOnDragListener(listener);
  
    GridLayout layout1 = (GridLayout)findViewById(R.id.layout1);
    layout1.setOnDragListener(listener);
    for(int i = 0; i < layout1.getChildCount(); i++){
      layout1.getChildAt(i).setOnDragListener(listener);
    }  
    LinearLayout layout2 = (LinearLayout)findViewById(R.id.layout2);
    layout2.setOnDragListener(listener);
    for(int i = 0; i < layout2.getChildCount(); i++){
      layout2.getChildAt(i).setOnDragListener(listener);
    }
    TextView delete = (TextView)findViewById(R.id.delete);
    delete.setOnDragListener(listener);
    TextView rename = (TextView)findViewById(R.id.rename);
    rename.setOnDragListener(listener);
  }
}
DragDropListener.java
 
public class DragDropListener implements OnLongClickListener, OnDragListener {
  static String TAG = "DragDrop";
  private RelativeLayout mRootLayout;
  private Context mContext;
  private ViewGroup mDragStartPosition = null;
 
  public DragDropListener(Context context, RelativeLayout root) {
    mContext = context;
    mRootLayout = root;
  }

  @Override
  public boolean onLongClick(View v) {
    ClipData data = ClipData.newPlainText("text", v.toString());
    View.DragShadowBuilder shadow = new MyDragShadowBuilder(v);
    v.startDrag(data, shadow, v, 0);
    // v.setVisibility(View.INVISIBLE);
    ViewGroup owner = (ViewGroup) v.getParent();
    owner.removeView(v);

    mRootLayout.findViewById(R.id.layout_head).setVisibility(View.VISIBLE);
    return false;
  }

  class MyDragShadowBuilder extends View.DragShadowBuilder {
    private Drawable shadow;

    public MyDragShadowBuilder(View v) {
      super(v);
      shadow = ((ImageView) v).getDrawable();
    }
    @Override
    public void onProvideShadowMetrics(Point size, Point touch) {
      int width = getView().getWidth();
      int height = getView().getHeight();
      shadow.setBounds(0, 0, width, height);
      size.set(width, height);
      touch.set(width, height);
    }
    @Override
    public void onDrawShadow(Canvas canvas) {
      shadow.draw(canvas);
    }
  }

  @Override
  public boolean onDrag(View v, DragEvent event) {
    final int action = event.getAction();
    View view = (View) event.getLocalState();
    switch (action) {
    case DragEvent.ACTION_DRAG_STARTED:
      mDragStartPosition = (ViewGroup) view.getParent();
      return true;
    case DragEvent.ACTION_DRAG_ENTERED:
      return true;
    case DragEvent.ACTION_DRAG_EXITED:
      return true;
    case DragEvent.ACTION_DROP:
      if (v.getTag() == null){
        ViewGroup owner = (ViewGroup) v.getParent();
        int index = owner.indexOfChild(v);
        owner.addView(view, index);
      } else if (v.getTag().equals("layout1") || v.getTag().equals("layout2")) {
        ViewGroup container = (ViewGroup) v;
        container.addView(view);
        view.setVisibility(View.VISIBLE);
      } else if (v.getTag().equals("Delete")) {
        Toast.makeText(mContext, "Delete", Toast.LENGTH_SHORT).show();
        if (mDragStartPosition != null) mDragStartPosition.addView(view);
        view.setVisibility(View.VISIBLE);
      } else if (v.getTag().equals("Rename")) {
        Toast.makeText(mContext, "Rename", Toast.LENGTH_SHORT).show();
        if (mDragStartPosition != null) mDragStartPosition.addView(view);
        view.setVisibility(View.VISIBLE);
      }
      return true;
    case DragEvent.ACTION_DRAG_ENDED:
      mRootLayout.findViewById(R.id.layout_head).setVisibility(View.INVISIBLE);
      return true;
    default:
      return true;
    }
  }
}
activity_main.xml
 

  android:id="@+id/root" 
  android:layout_height="match_parent" 
  android:layout_width="match_parent" 
  tools:context=".MainActivity"