• sdfsdfasfsdfdsfasfdfasfasadsfasdfasf


    白包api

    图片编辑功能:

    1、你变体下

    SnapEditMenuManager 的 这个方法 public void initEditMainMenu(final EditUITabMenu editUITabMenu)

    换成你需要的配置,需要哪个功能 就拿哪一坨,别拿多了

    //相框
    MenuBean menuBean = new MenuBean(MenuID.EDIT_MENU_ID_FRAME);
    menuBean.nameResId = R.string.edit_frame;
    menuBean.iconResId = R.drawable.edit_icon_frame;
    menuBean.iconSelectedResId = R.drawable.edit_icon_frame;
    IOperationUIMenu operationUIMenu = new OperationUIWorkerFrame();
    ((OperationUIWorkerFrame) operationUIMenu).setSelectedCategoryId(mCategoryId);
    operationUIMenu.setMenuBean(menuBean);
    editUITabMenu.addOperationUITab(operationUIMenu);
     
    //滤镜
    menuBean = new MenuBean(MenuID.EDIT_MENU_ID_FILTER);
    menuBean.nameResId = R.string.filter;
    menuBean.iconResId = R.drawable.edit_icon_filter;
    menuBean.iconSelectedResId = R.drawable.edit_icon_filter;
    operationUIMenu = new OperationUIWorkerFilter();
    ((OperationUIWorkerFilter) operationUIMenu).setFilterGroup(filterGroup);
    operationUIMenu.setMenuBean(menuBean);
    editUITabMenu.addOperationUITab(operationUIMenu);
     
    //贴纸
    menuBean = new MenuBean(MenuID.EDIT_MENU_ID_STICKER);
    menuBean.nameResId = R.string.sticker;
    menuBean.iconResId = R.drawable.edit_icon_sticker;
    menuBean.iconSelectedResId = R.drawable.edit_icon_sticker;
    operationUIMenu = new OperationUIWorkerSticker(CategoryType.TYPE_STICKER);
    ((OperationUIWorkerSticker) operationUIMenu).setSelectedCategoryId(mCategoryId);
    operationUIMenu.setMenuBean(menuBean);
    editUITabMenu.addOperationUITab(operationUIMenu);
     
    //特效
    menuBean = new MenuBean(MenuID.EDIT_MENU_ID_SPIRAL);
    menuBean.nameResId = R.string.edit_spiral;
    menuBean.iconResId = R.drawable.edit_icon_spiral;
    menuBean.iconSelectedResId = R.drawable.edit_icon_spiral;
    operationUIMenu = new OperationUIWorkerSpiral();
    ((OperationUIWorkerSpiral) operationUIMenu).setSelectedCategoryId(mCategoryId);
    operationUIMenu.setMenuBean(menuBean);
    editUITabMenu.addOperationUITab(operationUIMenu);
     
    //背景虚化
    menuBean = new MenuBean(MenuID.EDIT_MENU_ID_PORTRAIT);
    menuBean.nameResId = R.string.auto_blur;
    menuBean.iconResId = R.drawable.edit_icon_portrait;
    menuBean.iconSelectedResId = R.drawable.edit_icon_portrait;
    operationUIMenu = new OperationUIWorkerPortrait(this);
    operationUIMenu.setMenuBean(menuBean);
    editUITabMenu.addOperationUITab(operationUIMenu);
     
    //马赛克
    menuBean = new MenuBean(MenuID.EDIT_MENU_ID_MOSAIC);
    menuBean.nameResId = R.string.edit_mosaic;
    menuBean.iconResId = R.drawable.edit_icon_mosaic;
    menuBean.iconSelectedResId = R.drawable.edit_icon_mosaic;
    operationUIMenu = new OperationUIWorkerMosaic();
    operationUIMenu.setMenuBean(menuBean);
    editUITabMenu.addOperationUITab(operationUIMenu);
     
    //涂鸦
    menuBean = new MenuBean(MenuID.EDIT_MENU_ID_BRUSH);
    menuBean.nameResId = R.string.edit_brush;
    menuBean.iconResId = R.drawable.edit_icon_brush;
    menuBean.iconSelectedResId = R.drawable.edit_icon_brush;
    operationUIMenu = new OperationUIWorkerBrush();
    operationUIMenu.setMenuBean(menuBean);
    editUITabMenu.addOperationUITab(operationUIMenu);
     
    //调色
    menuBean = new MenuBean(MenuID.EDIT_MENU_ID_ADJUST);
    menuBean.nameResId = R.string.adjust;
    menuBean.iconResId = R.drawable.edit_icon_adjust;
    menuBean.iconSelectedResId = R.drawable.edit_icon_adjust;
    operationUIMenu = new OperationUIWorkerEditAdjust(this);
    operationUIMenu.setMenuBean(menuBean);
    editUITabMenu.addOperationUITab(operationUIMenu);
     
    //裁剪
    menuBean = new MenuBean(MenuID.EDIT_MENU_ID_CROP);
    menuBean.nameResId = R.string.crop;
    menuBean.iconResId = R.drawable.edit_icon_crop;
    menuBean.iconSelectedResId = R.drawable.edit_icon_crop;
    operationUIMenu = new OperationUIWorkerCrop();
    operationUIMenu.setMenuBean(menuBean);
    editUITabMenu.addOperationUITab(operationUIMenu);
     
    //文字
    menuBean = new MenuBean(MenuID.EDIT_MENU_ID_TEXT);
    menuBean.nameResId = R.string.edit_text;
    menuBean.iconResId = R.drawable.edit_icon_text;
    menuBean.iconSelectedResId = R.drawable.edit_icon_text;
    operationUIMenu = new OperationUIWorkerText();
    operationUIMenu.setMenuBean(menuBean);
    editUITabMenu.addOperationUITab(operationUIMenu);
     
    //曲线
    menuBean = new MenuBean(MenuID.EDIT_MENU_ID_CURVE_FILTER);
    menuBean.nameResId = R.string.curve_filter;
    menuBean.iconResId = R.drawable.edit_icon_curve;
    menuBean.iconSelectedResId = R.drawable.edit_icon_curve;
    operationUIMenu = new OperationUICurveFilter();
    operationUIMenu.setMenuBean(menuBean);
    editUITabMenu.addOperationUITab(operationUIMenu);
     
    //旋转
    menuBean = new MenuBean(MenuID.EDIT_MENU_ID_ROTATE);
    menuBean.nameResId = R.string.warp_twirl;
    menuBean.iconResId = R.drawable.puzzle_icon_rotate;
    menuBean.iconSelectedResId = R.drawable.puzzle_icon_rotate;
    operationUIMenu = new OperationUIWorkerRotate();
    operationUIMenu.setMenuBean(menuBean);
    editUITabMenu.addOperationUITab(operationUIMenu);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111

    2、各种编辑功能入口,click事件里用这个方法,第三个参数先在步骤1自己对应下哈

    PictureSelectorHelper.selectorForEdit(activity, "", MenuID.EDIT_MENU_ID_CURVE_FILTER)
    
    • 1

    相机

    1、你变体下这个类PictureSelectorHelper,确认下有这个方法,没有加上

    fun selectorGalleryCameraEdit(activity: Activity, fromSource: String, toWhere: Int = 0) {
            if (DEBUG) {
                Log.e(TAG, "activity=$activity")
            }
            val selectorStyle = configPictureSelectorStyle(activity)
            val selectionModel: PictureSelectionModel = PictureSelector.create(activity)
                .openGallery(SelectMimeType.TYPE_IMAGE)
                .setImageEngine(GlideEngine.createGlideEngine())
                .setImageSpanCount(1)
                .isDisplayCamera(true)
                .isTitleBarCamera(false)
                .setSelectorUIStyle(selectorStyle)
                .setSelectionMode(SelectModeConfig.SINGLE)
                .isDirectReturnSingle(false)
                .setPermissionsInterceptListener(object : OnPermissionsInterceptListener {
                    override fun requestPermission(
                        fragment: Fragment?,
                        permissionArray: Array<out String>?,
                        call: OnRequestPermissionListener?
                    ) {
                        realRequestPermission(fromSource, fragment, permissionArray, call)
                    }
    
                    override fun hasPermissions(
                        fragment: Fragment?,
                        permissionArray: Array<out String>?
                    ): Boolean {
                        return realHasPermissions(permissionArray, fragment)
                    }
    
                })
                .setPermissionDeniedListener { fragment, permissionArray, requestCode, call ->
    
                }
            selectionModel.forResult(object : OnResultCallbackListener<LocalMedia> {
                override fun onResult(result: ArrayList<LocalMedia>?) {
                    val localMedia = result?.getOrNull(0) ?: return
                    val path: String = localMedia.realPath
                    var imgPath = if (TextUtils.isEmpty(path)) {
                        PhotoFileUtils.getPath(activity, Uri.parse(localMedia.path))
                    } else {
                        path
                    }
                    SnapEditActivity.startSnapEditActivity(
                        activity,
                        imgPath,
                        fromSource,
                        toWhere
                    )
                }
    
                override fun onCancel() {
    
                }
            })
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    2、onclick加这个调用

    PictureSelectorHelper.selectorGalleryCameraEdit(it,"",0)
    
    • 1

    相册

    其实就是跳转一个图片编辑功能,第三个参数自己选一下

    PictureSelectorHelper.selectorForEdit(activity, "", MenuID.XXX)
    
    • 1

    我的作品

    最多存4个我的作品,代码看,这个qa-xinlv-1.4.6 分支的,这俩提交 ff4b026a、62629bbd

    1、在你变体下加一个这个类

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GiCq7gxS-1669454003345)(/Users/apus/Library/Application Support/typora-user-images/image-20221126164427229.png)]

    package com.photo.edit.free.edit
    
    import android.util.Log
    import com.filter.camera.common.pref.CommonSharedPrefs
    import com.filter.camera.lite.BuildConfig
    import org.interlaken.common.XalContext
    import org.json.JSONArray
    
    
    /**
     * 保存最多四个
     */
    object EdittedWorks {
        private var worksFilePath = mutableListOf<String>()
        private const val WORKS_SP_NAME = "works_name"
        private const val WORKS_SP_KEY = "works_key"
    
        private const val TOTAL = 4
    
        fun initDate() {
            parseWorksFromSp()
        }
    
        fun add(path: String) {
            worksFilePath.add(0,path)
            if (worksFilePath.size > TOTAL) {
                worksFilePath.removeAt(worksFilePath.size-1)
            }
            saveWorksToSp()
        }
    
        fun getEditWorksPath(): List<String> {
            return worksFilePath
        }
    
        private fun saveWorksToSp() {
            var str = ""
            worksFilePath.forEach {
                if (BuildConfig.DEBUG) {
                    Log.e("haha", "saveWorksToSp: $str")
                }
                str+= "===$it"
            }
            CommonSharedPrefs.putString(WORKS_SP_NAME, XalContext.getContext(), WORKS_SP_KEY,str)
        }
    
        private fun parseWorksFromSp() {
            worksFilePath.clear()
            val str = CommonSharedPrefs.getString(
                WORKS_SP_NAME,
                XalContext.getContext(),
                WORKS_SP_KEY,
                ""
            )
            str.split("===").forEach {
                if (it.isNotEmpty()) {
                    worksFilePath.add(it)
                }
            }
        }
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    2、在你的页面的oncreate调一下

    EdittedWorks.initDate()
    
    • 1

    3、在你变体下这个类SnapEditUIBoard,加这些代码

     if (outputFile != null && !outputFile.isEmpty()) {
                    EdittedWorks.INSTANCE.add(outputFile);
                }
    
    • 1
    • 2
    • 3

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-btIyUZcb-1669454003347)(/Users/apus/Library/Application Support/typora-user-images/image-20221126164831995.png)]

    4、通过 EdittedWorks.getEditWorksPath() 获取我的作品的地址,是一个 List,在你写的“我的作品”recyclerview 初始化adapter 时候就传这个list

    在这里插入图片描述

    5、在你写的“我的作品”recyclerview 的item viewholder 中通过Glide加载图片

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UFE5B3hI-1669454003358)(/Users/apus/Library/Application Support/typora-user-images/image-20221126165220705.png)]

    itemView.findViewById<ImageView>(R.id.work)?.let {
                    Glide.with(itemView.context)
                        .asBitmap()
                        .load(filePath)
                        .diskCacheStrategy(DiskCacheStrategy.NONE)
                        .centerCrop()
                        .into(object : BitmapImageViewTarget(it) {
                            override fun setResource(resource: Bitmap?) {
                                it.setImageBitmap(resource)
                            }
                        })
                }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    6、你的页面o nResume的时候,刷一下recyclerview,刷的时候外面包一层读权限检测

    if (PermissionChecker.isCheckReadStorage(context)) {
                myWorksAdapter.notifyDataSetChanged()
            }
    
    • 1
    • 2
    • 3

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iKUhOKjz-1669454003359)(/Users/apus/Library/Application Support/typora-user-images/image-20221126170007092.png)]

  • 相关阅读:
    无需配置MySQL,Navicat也有在线版了?
    unity学习笔记之不通过路径通过拖拽获取lua脚本里定义的UI组件
    天龙八部科举答题问题和答案(全4/8)
    Redis 持久化 - RDB 与 AOF
    MyBatis3源码深度解析(十)MyBatis常用工具类(三)MetaObject&MetaClass
    多线程应用——线程池
    idea项目配置三大步
    Dom操作指南
    not read Username for “https://gitee.com“: Device not configured
    c++ 防火墙 添加白名单
  • 原文地址:https://blog.csdn.net/qq_44477844/article/details/128054322