DIY无论是模板还是其他都需要用户很好的自定义图片 无聊是网络图还是本地图片
本次主要展示如何拖拽替换 指定区域的图。需联系到Android DIY之路 (一)本文只写了核心,如果需要demo可以留言讨论
惯例看效果
- 本地资源图片的获取
- 设定拖拽监听对象
3.设定拖拽监听区域
本地资源图片的获取
/**
* 查询最新多少张照片
*
* @param limitNum 限制数量 <=0为查询所有
* @param isTimeOrder 是否最新
*/
private void scanImages(final int limitNum, final boolean isTimeOrder) {
//通知系统相册更新
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// Intent mediaScanIntent = new Intent(
// Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri contentUri = Uri.fromFile(out);\\out is your output file
mediaScanIntent.setData(contentUri);
// getActivity().sendBroadcast(mediaScanIntent);
} else {
getActivity().sendBroadcast(new Intent(
Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://"
+ Environment.getExternalStorageDirectory())));
}
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
Toast.makeText(getActivity(), "未检测到SD卡", Toast.LENGTH_SHORT).show();
return;
}
new AsyncTask<Void, Void, List<String>>() {
@Override
protected List<String> doInBackground(Void... params) {
String firstImage = null;
List<String> paths = new ArrayList<String>();
List<File> files = new ArrayList<File>();
Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
ContentResolver mContentResolver = getActivity()
.getContentResolver();
Cursor mCursor = mContentResolver.query(mImageUri, null,
MediaStore.Images.Media.MIME_TYPE + "=? or " + MediaStore.Images.Media.MIME_TYPE + "=?",
new String[]{"image/jpeg", "image/png"},
MediaStore.Images.Media.DATE_MODIFIED + " DESC LIMIT " + limitNum);
// +" DESC or asc"
//按时间顺序DATE_MODIFIED 时间早的在前
if (mCursor == null)
return null;
while (mCursor.moveToNext()) {
String path = mCursor.getString(mCursor
.getColumnIndex(MediaStore.Images.Media.DATA));
if (firstImage == null) firstImage = path;
File singleFile = new File(path);
files.add(singleFile);
// //倒序后按最新排列
// if (isTimeOrder) {
// Collections.reverse(files);
// }
for (File file : files) {
String a = file.getAbsolutePath();
if (!paths.contains(a)) {
paths.add(a);
}
}
}
mCursor.close();
ULog.e("paths===" + paths.toString());
return paths;
}
@Override
protected void onPostExecute(List<String> paths) {
super.onPostExecute(paths);
if (paths == null)
return;
mImgPaths = paths;
给你的适配器使用
}
}
.
execute();
}
设定监听拖拽对象
这里根据情景设置监听的对象当然的适配器每个item
我们这里设计为长按 开启拖拽
我这里用的Recyclerview适配器里面得到每个item。你也可以自定义去定义类似的OnitemLong
holder.getmView().setOnLongClickListener(null);
holder.getmView().setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
dragPosition = position;
Log.e("rex", "dragPosition--" + dragPosition);
shadowView = v; //拖拽后的影子 你可以自定义不同区域 显示不同效果
String TAG = "test";
ClipData.Item item = new ClipData.Item((String) v.getTag());
ClipData data = new ClipData(TAG, new String[]{ClipDescription.MIMETYPE_TEXT_PLAIN}, item);
这里的path 是你当前item对象的图片
v.startDrag(data, new View.DragShadowBuilder(v), path, 0);
return true;
}
});
}
设定拖拽监听区域
一般view都可以接受 这一拖拽过程。所以我们将 所有可操作替换的图片对象(这个是怎么做的 可以看DIY之路(一))绑定上接收事件,一一绑定即可 impl接口随你自己定义即可 event.getLocalState();就是上面传的path
public static void bindDragInZone(View view, final DragStatus impl) {
final int[] dragPoint = new int[2];
final boolean[] isIn = {false};
final String[] localState = {""};
view.setOnDragListener(new View.OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
final int action = event.getAction();
switch (action) {
case DragEvent.ACTION_DRAG_STARTED://拖拽开始
localState[0] = (String) event.getLocalState();
Log.i("rex", "localState-----" + localState[0]);
if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
// shadowView.setBackgroundResource(R.drawable.xml_rect_line_bg);
return true;
}
return false;
case DragEvent.ACTION_DRAG_ENTERED://拖拽进入目标区域
Log.i("rex", "拖拽进入目标区域" + event.getX() + "----" + event.getY());
ULog.e("拖拽进入目标区域");
isIn[0] = true;
return true;
case DragEvent.ACTION_DRAG_LOCATION://拖拽位置
return true;
case DragEvent.ACTION_DRAG_EXITED://拖拽到目标区域外
isIn[0] = false;
ULog.e("拖拽到目标区域外");
return true;
case DragEvent.ACTION_DROP: //拖拽完成之后松开手指
ULog.e("拖拽完成之后松开手指" + event.getX() + "----" + event.getY());
dragPoint[0] = (int) event.getX();
dragPoint[1] = (int) event.getY();
return true;
case DragEvent.ACTION_DRAG_ENDED://拖拽完成
if (isIn[0] && !TextUtils.isEmpty(localState[0]) && impl != null) {
impl.complete(localState[0]);
}
isIn[0] = false;
// shadowView.setBackgroundResource(0);
// if (!isIn) {
// return true;
// }
// findDragPostion(dragPoint[0], dragPoint[1]);
// isIn = false;
return true;
default:
break;
}
return false;
}
});