android拖动imageview实现复制效果

首先实现一个自定义的拖动阴影类,该类主要功能将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-08-06 03:40:18

android拖动imageview实现复制效果的相关文章

Android自定义imageview可对图片进行多点缩放和拖动

package com.msstudent.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Matrix; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; i

Android 利用TimerTask实现ImageView图片播放效果

在项目开发中,往往 要用到图片播放的效果,今天就用TimerTask和ImageView是实现简单的图片播放效果. 其中,TimerTask和Timer结合一起使用,主要是利用TimerTask的迭代延时等时间段处理事件的机制. 具体实例如下: 1.layout xml代码 <span style="font-family:Microsoft YaHei;font-size:18px;"><LinearLayout xmlns:android="http:/

Android WindowManager实现悬浮窗效果 (一)——与当前Activity绑定

最近有学生做毕业设计,想使用悬浮窗这种效果,其实很简单,我们可以通过系统服务WindowManager来实现此功能,本章我们来试验一下在当前Activity之上创建一个悬浮的view. 第一步:认识WindowManager l  这个接口用于与 window manager (窗口管理器, 应用框架层) 进行交互. l  通过getSystemService(Context.WINDOW_SERVICE)可以获取到WM的实例. l  继承关系 public interface WindowMa

Android拖动和缩放图片

Android拖动和缩放图片 2014年5月9日 我们在使用应用其中常常须要浏览图片.比方在微信其中.点击图片之后能够对图片进行缩放. 本博客介绍怎样对图片进行拖拽和缩放.这首先要了解Android中的触摸机制了,在屏幕中有手指按下.手指抬起.手指移动还有多个手指触摸的动作. 我们要实现对图片的拖拽和缩放就是要基于这些动作来进行逻辑处理. 图片的拖拽主要是计算手指開始的位置与当前手指的位置关系,来进行平移的,详细能够看代码. 图片的缩放就涉及到计算两点之间的距离来得到缩放比,调用矩阵方法来达到缩

Android 自定义ImageView支持缩放,拖拽,方便复用

今天刚发了一篇关于ImageView的缩放和拖拽的博客,然后我想了下,将他自定义下,方便我们来复用这个imageView,效果我就不多说了,http://blog.csdn.net/xiaanming/article/details/8827257就是这个效果,我只是把他抽出来自定义了下,代码还是贴上吧,我也将demo上传一下,有疑问大家指出来,大家共同学习,共同进步,呵呵 [java] view plaincopy package com.example.myimageview; import

Android -- 使用ViewPager实现画廊效果

1,今天在微信推送文章看到实现画廊效果,感觉挺不错的,就来写写试试,先来看一下效果图: 上面的效果基本上可以用两个功能点来包含:ViewPager的切换动画.ImageView的倒影的实现 嗯,先来将我们主要的功能来实现,就是我们的ViewPager展示图片 主界面的布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.

【转】Android 实现蘑菇街购物车动画效果

原文出处:http://blog.csdn.net/wangjinyu501/article/details/38400479 1.思路 目前想到两种方式实现这种效果,一是使用Tween动画,直截了当的进行一个移动,蘑菇街就是使用这样的方法.二是使用WindowManager创建一个View,然后对这个View进行移动. 2.实现 本文先用方式一方法实现,之后会用方式二方法实现. 方式一: Activity代码: 1 package com.kince.mogujie; 2 3 import a

50个Android开发人员必备UI效果源码[转载]

50个Android开发人员必备UI效果源码[转载] http://blog.csdn.net/qq1059458376/article/details/8145497 Android 仿微信之主页面实现篇Android 仿微信之界面导航篇Android 高仿QQ 好友分组列表Android 高仿QQ 界面滑动效果Android 高仿QQ 登陆界面Android 对Path的旋转效果的拓展Android高仿360安全卫士布局源码Android SlidingDrawer 滑动抽屉效果Androi

android 仿ppt进入动画效果合集

EnterAnimation android 仿ppt进入动画效果合集, 百叶窗效果,擦除效果,盒状效果,阶梯效果,菱形效果,轮子效果,劈裂效果,棋盘效果, 切入效果,扇形展开效果,十字扩展效果,随机线条效果,向内溶解效果,圆形扩展效果, 适用于各种view和viewgroup,activity即用于页面根部viewgroup, 自定义viewgroup自动换行layout, 看效果图 Series of entrance animation effects just like ppt in A