首先实现一个自定义的拖动阴影类,该类主要功能将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" />
时间: 2024-10-05 10:57:16