Android DIY之路 (二) 编辑素材图 提供拖拽替换指定区域

DIY无论是模板还是其他都需要用户很好的自定义图片 无聊是网络图还是本地图片
本次主要展示如何拖拽替换 指定区域的图。需联系到Android DIY之路 (一)本文只写了核心,如果需要demo可以留言讨论
惯例看效果
拖拽替换

  1. 本地资源图片的获取
  2. 设定拖拽监听对象
    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;
            }
        });
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值