android拖动imageview实现复制效果
来源:互联网 发布:手机阿里云os系统破解 编辑:程序博客网 时间:2024/05/21 06:50
首先实现一个自定义的拖动阴影类,该类主要功能将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 stubshadow = new ColorDrawable(Color.LTGRAY);// 浅灰色}// 在该方法中绘制拖动阴影图像 实例化newBitmap变量@Overridepublic void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) {// TODO Auto-generated method stubsuper.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的bitmapBitmap bitmap = ((BitmapDrawable) drawable).getBitmap();// 创建一个新的bitmapnewBitmap = 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);}}@Overridepublic void onDrawShadow(Canvas canvas) {// TODO Auto-generated method stubsuper.onDrawShadow(canvas);// 将图像正式绘制在阴影图像上canvas.drawBitmap(newBitmap, 0, 0, new Paint());}}
用来实现的主窗口
public class MainActivity extends Activity implements OnDragListener {private FrameLayout dragdropRegin;// 拖动到图像private ImageView imageView;@Overrideprotected 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() {@Overridepublic boolean onLongClick(View v) {// TODO Auto-generated method stubDragShadowBuilder mysBuilder = new MyDragShadowBuilder(imageView);// 开始拖动,方法中第一参数是ClipData类型的对象。用于传递剪切板数据,可以为nullv.startDrag(null, mysBuilder, null, 0);return true;}});}@Overridepublic 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;}@Overridepublic boolean onDrag(View v, DragEvent event) {// TODO Auto-generated method stubint 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" />
0 0
- android拖动imageview实现复制效果
- Android ImageView图片拖动效果
- android实现拖动效果
- android 实现拖动效果
- Android实现拖动效果
- Android拖动效果实现
- Android 用户界面ImageView拖动复制(Drag and Drop)
- android ImageView实现变暗效果
- android ImageView实现变暗效果
- android ImageView实现变暗效果
- Android开发实现拖动效果
- Android实现控件拖动效果
- Android实现对imageview的拖动以及缩放
- Android实现对imageview的拖动以及缩放
- Android实现对imageview的拖动以及缩放
- Android:自定义ImageView实现缩放,回弹效果
- Android之ImageView实现滤镜效果(setColotFilter)
- Android之ImageView实现滤镜效果(setColotFilter)
- 编码问题
- Codeforces 485B Valuable Resources(水题)
- 4.动态规划
- 图解SSL/TLS协议
- 远程连接Mysql报10038错误
- android拖动imageview实现复制效果
- Linux Device Driver 3, Chp 3 字符设备驱动程序 示例代码修改 -- for kernel 2.6.32
- MFC树形控件(CTreeCtrl)用法(上)
- cas cpu 硬件同步原语(compare and swap)
- Centos6.5 安装 Oracle11gR2(64位)
- C++中构造函数和析构函数避免调用虚函数的问题
- 如何在html的javascript中写函数function()并用正则表达式验证身份证号码与邮箱格式是否正确
- 排序算法——堆排序算法
- iOS8 Today 实现Clips widget