sdfsdfasfsdfdsfasfdfasfasadsfasdfasf

news2025/7/18 2:31:07

白包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);

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

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

相机

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() {

            }
        })
    }

2、onclick加这个调用

PictureSelectorHelper.selectorGalleryCameraEdit(it,"",0)

相册

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

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

我的作品

最多存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)
            }
        }
    }


}

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

EdittedWorks.initDate()

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)
                        }
                    })
            }

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

if (PermissionChecker.isCheckReadStorage(context)) {
            myWorksAdapter.notifyDataSetChanged()
        }

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/38147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线程的学习

v# 1. 线程基本概念 1.1进程 进程是指运行中的程序&#xff0c;比如启动了QQ&#xff0c;就相当于启动了一个进程&#xff0c;操作系统会为该进程分配空间&#xff1b;当我们使用迅雷&#xff0c;就相当于又启动了一个进程&#xff0c;操作系统将为迅雷分配新的内存空间&…

坦克大战①

1. java绘图技术 JFrame&#xff1a;画板 Jpanel&#xff1a;画板 Graphics&#xff1a;画笔 初始化画板&#xff0c;定义画框的大小&#xff0c;设置可视化&#xff1b; 1.1 画坦克 初始化我方坦克、敌方坦克 绘图&#xff1a;(1)更改背景颜色&#xff1b;(2)绘制敌方坦克…

【Docker】常用命令

背景 当下&#xff0c;docker技术已成为开发者常用的技术栈。不管是开发过程中需要应对的各种复杂多变的开发环境的搭建&#xff0c;还是生产部署环节需要的自动化运维&#xff0c;都离不开docker&#xff0c;本文简单介绍相关命令的含义&#xff0c;用作平时查询使用。 1. doc…

【计算机毕业设计】38.网上轰趴预订系统

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 摘要 在网上轰趴发展的整个过程中&#xff0c;网上轰趴预定担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类网上轰趴程序也在不断改进。本课题所设计的网上轰趴预定系统&#xff0c;使用SSM框架…

一文看懂Transformer(详解)

文章目录Transformer前言网络结构图&#xff1a;EncoderInput EmbeddingPositional Encoderself-attentionPadding maskAdd & NormFeed ForwardDecoderinputmasked Multi-Head Attentiontest时的Decoder预测Transformer 前言 Transformer最初是用于nlp领域的翻译任务。 …

大屏图表,ECharts 从“熟练”到入门

&#x1f4d6;阅读本文&#xff0c;你将 了解 配置驱动 的思想理解 Echarts 基本概念了解 graphic 和 动画基本玩法。了解 Echarts 基底组件的封装的思路 一、不是标题党&#xff01;Echarts&#xff0c;简历上人均 “熟练”&#xff1f; 公司最近在招外包&#xff0c;而因为…

基于ASP学生资助管理系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做ASP程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问题…

用Python蹭别人家图片接口,做一个【免费图床】吧

打开本文&#xff0c;相信你确实需要一个免费且稳定的图床&#xff0c;这篇博客就让你实现。 文章目录⛳️ 谁家的图床⛳️ 实战编码⛳️ 第一轮编码⛳️ 第二轮编码⛳️ 第三轮编码⛳️ 第四轮编码⛳️ 谁家的图床 这次咱们用新浪微博来实现【免费图床应用】&#xff0c;通过…

栈浅谈(上)

目录 栈的定义 栈的实现 初始化 判断栈是否为空 入栈操作 获取栈顶元素 出栈操作 遍历栈 销毁栈 完整代码演示 栈—STL 基本操作 例题 参考代码 栈的定义 说到栈&#xff0c;一些不会计算机语言的“小白”&#xff08;我就是&#xff09;就会想到栈道之类的词语…

基于JavaWeb的婚恋交友网站设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

如何平衡新老策略的好与坏,一道常见风控送命题解答

作为一个风控策略从业者&#xff0c;在做风险管理的过程中一直在做的就是&#xff0c;不断的挖掘有效的变量特征来填充风控决策体系&#xff0c;使决策体系的功效变大变强&#xff0c;最终形成一套可变的稳定风险护盾。我们常见的一个场景比如如何筛选一些新策略来挑战老策略&a…

【C++中预处理语句 include、define、if】

1.预处理阶段 预处理阶段&#xff0c;在实际发生编译之前就根据对应的预处理语句进行操作&#xff0c;等到预处理阶段完成之后才进行编译阶段 。 2.预处理语句 预处理语句主要有include、define、if 和 program。利用 # 进行标记 2.1 include语句 include语句就是将所包含的…

if-else练习

if单分支 输入两个数&#xff0c;分别放入x和y中&#xff0c;若两数不相等&#xff0c;则输出其中的大数&#xff0c;若两数相等&#xff0c;则输出字符串“xy&#xff1a;”并输出其值 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() {int a 0;int …

智慧油田解决方案-最新全套文件

智慧油田解决方案-最新全套文件一、建设背景1、智慧油田的概念及意义2、智慧油田的建设目标二、建设思路三、建设方案四、获取 - 智慧油田全套最新解决方案合集一、建设背景 1、智慧油田的概念及意义 石油产量、采收率、安全生产等都与石油工业未来息息相关&#xff0c;随着石…

十八、CANdelaStudio深入-Data Types

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的Data Types(数据类型),欢迎各位朋友订…

旧系统改造

背景 很多时候&#xff0c;我们在项目前期会优先确保项目业务的落地&#xff0c;在短时间内进行项目冲刺&#xff0c;最后完成项目上线。这样做让短时间内的目标达貌似达成了&#xff0c;却给系统留下了很大的隐患。 在项目的冲刺过程中&#xff0c;我们的精力大部分花在了业…

动态规划-不同路径

一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f; 示例 …

单源广度优先搜索 (leetcode经典例题 C++实现)

文章目录01矩阵地图分析腐烂的橘子深度优先搜索与广度优先搜索前情回顾&#xff1a; 深度搜索dfs与广度搜索bfs算法总结&#xff08;c 例题&#xff09; 本节是广度优先搜索的进阶&#xff1a; 01矩阵 传送门&#xff1a; https://leetcode.cn/problems/01-matrix/?envType…

JavaWeb----Servlet技术

JavaEE简介 什么是JavaEE JavaEE&#xff08;Java Enterprise Edition&#xff09;&#xff0c;Java企业版&#xff0c;是一个用于企业 级web开发平台,它是一组Specification。最早由Sun公司定制并发 布&#xff0c;后由Oracle负责维护。在JavaEE平台规范了在开发企业级web 应…

【操作系统】死锁(详细)

文章目录一、死锁的概念二、死锁的产生因素三、死锁的必要条件1、互斥条件2、占有和等待条件&#xff08;部分分配条件&#xff09;3、不剥夺条件4、循环等待条件&#xff08;环路条件&#xff09;四、死锁防止1、破坏互斥条件2、破坏占有和等待条件3、破坏不剥夺条件4、破坏循…