首先实现一个自定义的拖动阴影类,该类主要功能将ImageView控件中的图像放大50%后作为拖动阴影,拖动阴影实现如下
public class MyDragShadowBuilder extends DragShadowBuilder {
// 拖动阴影的区域
private static Drawable shadow;
// 储存绘制的拖动阴影图像
private static Bitmap newBitmap;
public MyDragShadowBuilder(View arg0) {
super(arg0);
// TODO Auto-generated constructor stub
shadow = new ColorDrawable(Color.LTGRAY);// 浅灰色
}
// 在该方法中绘制拖动阴影图像 实例化newBitmap变量
@Override
public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) {
// TODO Auto-generated method stub
super.onProvideShadowMetrics(shadowSize, shadowTouchPoint);
int width, heigth;
// 设置拖动阴影的宽度/高度为原宽/高度的1.5倍
width = (int) (getView().getWidth() * 1.5);
heigth = (int) (getView().getHeight() * 1.5);
// 设置拖动图像的绘制 区域
shadow.setBounds(0, 0, width, heigth);
// 设置拖动阴影图像的宽度和高度
shadowSize.set(width, heigth);
// 设置手指在拖动图像的位置 设置为中点
shadowTouchPoint.set(width / 2, heigth / 2);
if (getView() instanceof ImageView) {
// getView()方法返回的值就是构造方法传入的arg0 参数
ImageView imageView = (ImageView) getView();
// 获取drawable对象
Drawable drawable = imageView.getDrawable();
// 获取imageview的bitmap
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
// 创建一个新的bitmap
newBitmap = bitmap.createBitmap(width, heigth, Config.ARGB_8888);
Canvas canvas = new Canvas(newBitmap);
// 将图像绘制在画布上,但现在还没有正式将图像绘制在阴影图像上,目前只是将bitmap放大并绘制在newbitmap上
canvas.drawBitmap(newBitmap, new Rect(0, 0, bitmap.getWidth(),
bitmap.getHeight()), new Rect(0, 0, width, heigth), null);
}
}
@Override
public void onDrawShadow(Canvas canvas) {
// TODO Auto-generated method stub
super.onDrawShadow(canvas);
// 将图像正式绘制在阴影图像上
canvas.drawBitmap(newBitmap, 0, 0, new Paint());
}
}
用来实现的主窗口
public class MainActivity extends Activity implements OnDragListener {
private FrameLayout dragdropRegin;
// 拖动到图像
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dragdropRegin = (FrameLayout) findViewById(R.id.fl_dragdrop_region);
imageView = (ImageView) findViewById(R.id.imageview);
// 为目标设置拖动监听器
imageView.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
// TODO Auto-generated method stub
DragShadowBuilder mysBuilder = new MyDragShadowBuilder(
imageView);
// 开始拖动,方法中第一参数是ClipData类型的对象。用于传递剪切板数据,可以为null
v.startDrag(null, mysBuilder, null, 0);
return true;
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onDrag(View v, DragEvent event) {
// TODO Auto-generated method stub
int action = event.getAction();
switch (action) {
// 开始拖动
case DragEvent.ACTION_DRAG_STARTED:
System.out.println("drag started");
break;
// 进入目标区域
case DragEvent.ACTION_DRAG_ENTERED:
System.out.println("drag entered");
break;
// 在目标区域移动
case DragEvent.ACTION_DRAG_LOCATION:
System.out.println("drag location x=" + event.getX() + " y ="
+ event.getY());
break;
// 离开目标区域
case DragEvent.ACTION_DRAG_EXITED:
System.out.println("drage exited");
break;
// 在目标区域放下ImageView控件
case DragEvent.ACTION_DROP:
System.out.println("drag drop");
ImageView imageView = (ImageView) getLayoutInflater().inflate(
R.layout.image, null);
LayoutParams layoutParams = new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
// 由于framelayout 不能直接使用坐标设置子视图的位置 这里用左边距和顶边距
layoutParams.leftMargin = (int) event.getX();
layoutParams.topMargin = (int) event.getY();
// 添加到视图中,完成复制
dragdropRegin.addView(imageView, layoutParams);
break;
case DragEvent.ACTION_DRAG_ENDED:
System.out.println("drag ended");
default:
return false;
}
return true;
}
}
以及布局文件
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<FrameLayout
android:id="@+id/fl_dragdrop_region"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/ic_launcher" />
</FrameLayout>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="50dp"
android:src="@drawable/ic_launcher" />