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"



