android全局拖拽效果实现startDragAndDrop
有多种方式实现全角拖拽,我们基于系统标准的api startDragAndDrop 来做介绍
实现步骤:
一、应用的的拖拽
1.1 通过长按触发
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
ClipData dragClipData = ClipData.newPlainText("", "");
View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v);
holder.itemView.startDragAndDrop(dragClipData, shadowBuilder, v, 0);
return true;
}
});
1.2、设置拖拽监听,收到消息后可以处理自己的业务
// 设置放置监听器
binding.textView.setOnDragListener((view, dragEvent) -> {
float x = dragEvent.getX();
float y = dragEvent.getY();
switch (dragEvent.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
LogUtil.d(TAG, "拖动开始: x=" + x + ", y=" + y);
return true;
case DragEvent.ACTION_DRAG_LOCATION:
LogUtil.d(TAG, "拖动中: x=" + x + ", y=" + y);
return true;
case DragEvent.ACTION_DROP:
LogUtil.d(TAG, "放开拖动: x=" + x + ", y=" + y);
return true;
case DragEvent.ACTION_DRAG_ENDED:
LogUtil.d(TAG, "拖动结束: x=" + x + ", y=" + y);
// 拖动结束
return true;
default:
return false;
}
});
二、应用外的拖拽,可以被第三方应用接受你的拖拽事件
2.1 我们通过分析一张图片给第三方,先把图片放到图库,得到一个uri
public static Uri saveToGallery(Context context, Bitmap bitmap) {
ContentValues values = new ContentValues();
long currentTimeMillis = System.currentTimeMillis();
//这个名称要唯一,否则到了32会报错
values.put(MediaStore.Images.Media.DISPLAY_NAME, "image_name" +currentTimeMillis); // 图片名称
values.put(MediaStore.Images.Media.DESCRIPTION, "image_description"); // 图片描述
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); // 图片的MIME类型
values.put(MediaStore.Images.Media.DATE_TAKEN, currentTimeMillis); // 图片的拍摄日期
// 获取外部存储的公共图片目录
Uri externalContentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
// 保存图片到系统媒体库
try {
// 使用ContentResolver将Bitmap保存到指定的Uri
Uri uri = context.getContentResolver().insert(externalContentUri, values);
if (uri != null) {
OutputStream outputStream = context.getContentResolver().openOutputStream(uri);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); // 将Bitmap压缩并保存到Uri对应的文件中
outputStream.flush();
outputStream.close();
// 刷新媒体库
MediaStore.Images.Media.insertImage(context.getContentResolver(), bitmap, "title", "description");
return uri;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
2.2 把图片的uri发送出去,注意 startDragAndDrop的最后一个参数,需要让其他用有权限访问才可以。
val dragClipData = ClipData.newUri(requireContext().contentResolver, "Image", imageUri)
val dragShadow = View.DragShadowBuilder(holder.itemView)
holder.itemView.startDragAndDrop(dragClipData, dragShadow, null,DRAG_FLAG_GLOBAL.or(DRAG_FLAG_GLOBAL_URI_READ).or(DRAG_FLAG_OPAQUE))
如有更多需求,请参考官网示例:
doc地址:Enable drag and drop | Views | Android Developers
源码地址:git@github.com:android/user-interface-samples.git
原文地址:https://blog.csdn.net/szdenny/article/details/144449427
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!