Android 拖放操作基础学习
拖动效果如图下
1 xml文档
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
android:orientation="vertical"
tools:context="com.yulintu.customcontrol.DragActivity">
<LinearLayout
android:id="@+id/red"
android:padding="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:text="红色" />
<ImageView
android:layout_width="30dp"
android:background="@color/colorRed"
android:layout_height="30dp"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/green"
android:padding="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:text="黄色" />
<ImageView
android:layout_width="30dp"
android:background="@color/colorGreen"
android:layout_height="30dp"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/blue"
android:padding="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:text="蓝色" />
<ImageView
android:layout_width="30dp"
android:background="@color/colorBlue"
android:layout_height="30dp"
/>
</LinearLayout>
<ImageView
android:id="@+id/image"
android:background="#66666666"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
2 activity代码
package com.yulintu.customcontrol;
import android.annotation.TargetApi;
import android.content.ClipData;
import android.content.ClipDescription;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.DragEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import static android.view.View.DRAG_FLAG_GLOBAL;
public class DragActivity extends AppCompatActivity {
LinearLayout red;
LinearLayout green;
LinearLayout blue;
ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_drag);
//初始化被拖动的控件
red = (LinearLayout) findViewById(R.id.red);
green = (LinearLayout) findViewById(R.id.green);
blue = (LinearLayout) findViewById(R.id.blue);
//为控件设置长按监听事件
red.setOnLongClickListener(longClickListener);
green.setOnLongClickListener(longClickListener);
blue.setOnLongClickListener(longClickListener);
//初始化被响应拖动的控件
imageView = (ImageView) findViewById(R.id.image);
MyDragListener dragListener = new MyDragListener();
//为响应控件设置拖动的响应事件--一旦拖动产生,回调该响应事件
imageView.setOnDragListener(dragListener);
}
private View.OnLongClickListener longClickListener = new View.OnLongClickListener() {
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public boolean onLongClick(View v) {
switch (v.getId()) {
case R.id.red:
startDrag(v, "red");
case R.id.green:
startDrag(v, "green");
case R.id.blue:
startDrag(v, "blue");
break;
}
return true;
}
};
@TargetApi(Build.VERSION_CODES.N)
private void startDrag(View v, String tag) {
//通过ClipData传递数据给响应的控件
ClipData.Item item = new ClipData.Item(tag);
ClipData clipData = new ClipData(tag, new String[]{ClipDescription.MIMETYPE_TEXT_PLAIN}, item);
View.DragShadowBuilder builder = new View.DragShadowBuilder(v);
v.startDrag(clipData, builder, null, DRAG_FLAG_GLOBAL);
}
//设置拖动响应事件
protected class MyDragListener implements View.OnDragListener {
@Override
public boolean onDrag(View v, DragEvent event) {
int action = event.getAction();
//一旦拖动产生,回调该响应事件,通过拖动的类型来设置不同的效果
switch (action) {
case DragEvent.ACTION_DRAG_STARTED:
if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
v.setBackgroundColor(Color.WHITE);
return true;
}
return false;
case DragEvent.ACTION_DRAG_ENTERED:
v.setBackgroundColor(Color.GRAY);
return true;
case DragEvent.ACTION_DRAG_LOCATION:
return true;
case DragEvent.ACTION_DRAG_EXITED:
v.setBackgroundColor(Color.WHITE);
return true;
case DragEvent.ACTION_DROP:
//获取拖动事件传递过来的数据
ClipData.Item item = event.getClipData().getItemAt(0);
CharSequence text = item.getText();
String s = String.valueOf(text);
//由传递过来的数据来为响应控件设置不同的颜色
v.setBackgroundColor(getColor(s));
return true;
case DragEvent.ACTION_DRAG_ENDED:
return true;
}
return false;
}
}
private int getColor(String s) {
switch (s) {
case "red":
return getResources().getColor(R.color.colorRed);
case "blue":
return getResources().getColor(R.color.colorBlue);
case "green":
return getResources().getColor(R.color.colorGreen);
}
return getResources().getColor(R.color.colorPrimary);
}
}