用Kotlin撸一个图片压缩插件-实战篇(三)

简述: 由于个人原因,已经有很长一段时间没有写过文章,有句话是那么说的只要开始就不会太晚,所以我们开始《用Kotlin撸一个图片压缩插件》系列文章最后一篇实战篇。实际上我已经把源码发布到了GitHub,代码很简单。有了前两篇文章的基础,这篇文章将会使用Kotlin从零开始带你撸个图片压缩插件。

一、开发前期准备工作

  • 1、访问TinyPng官网注册TinyPng开发者账号,拿到TinyPng
    ApiKey,整个过程只需简单注册验证即可。

  • 2、由于本项目图片压缩框架是基于TinyPng的图片压缩API来实现的,所以需要在TinyPng官网提供了develop开发库,可以找到相应Java的jar,为了方便下载这里就直接贴出地址了:TinyPng依赖包下载

  • 3、由于图片插件使用到GUI,插件GUI采用的是Java中的Swing框架搭建,具体可以去复习相关Swing的知识点,当然只需要大概了解即可,毕竟这个不是重点。

  • 4、需要去掌握插件开发的基础知识,由于本篇文章是实战篇就不去细讲插件基础知识,具体详情可参照该系列的第二篇文章用Kotlin撸一个图片压缩插件-插件基础篇(二)

  • 5、需要有Kotlin的基本开发知识,比如Kotlin中扩展函数的封装,Lambda表达式,函数式API,IO流API的使用

二、图片压缩插件基本功能点

图片压缩插件主要支持如下两大功能:

  • 1、支持指定图片源输入目录批量压缩到一个指定的输出目录。

  • 2、支持在AndroidStudio项目中直接选中指定的一个或多个图片,右键点击直接压缩。

三、实现思路分析

实现的整体思路:首先我们需要找到实现关键点,然后从关键点一步步向外扩展延伸,那么实现图片压缩的插件的关键点在哪里,肯定毫无疑问是图片压缩API,也就是TinyPng API函数调用实现。

Tinify.fromFile(inputFile).toFile(inputFile)

通过以上的TinyPng API就可以找到关键点,一个是输入文件另一个则是输出文件,那么我们这个图片压缩插件的所有实现都是围绕着如何通过一个简单的方式指定一个输入文件或目录和一个输出文件或目录。

没错就是这么简单,那么我们一起来分析下上面两大功能实现思路其实也很简单:

  • 功能点一: 就是通过Swing框架中的JFileChooser组件,打开并指定一个图片输入文件或目录和一个图片压缩后的输出文件或目录即可。

  • 功能点二: 通过Intellij Idea open api中的 DataKeys.VIRTUAL_FILE_ARRAY.getData(this)拿到当前选中的Virtual Files,也就是当前选中的文件把选中的文件当做输入文件,然后图片压缩后文件直接输出到源文件中即可。

注意: 由于Tiny.fromFile().toFile()内部源码实际上通过OkHttp发送图片压缩的网络请求,而且内部采用的方式是同步请求的,但是在IDEA Plugin开发中主线程是不能执行耗时任务的,所以需要将该API方法调用放在异步任务中

四、代码结构和实现

  • action包:主要定义插件中的两个action,我们都知道在插件开发中Action是功能执行的入口,ImageSlimmingAction是前面说到第一个功能点批量压缩指定输入和输出目录的,RightSelectedAction是前面说过的第二个功能点在项目选中图中文件直接右键压缩的, 最后这两个Action都需要在plugin.xml中注册。
  <actions>
        <action class="com.mikyou.plugins.image.slimming.action.ImageSlimmingAction" text="ImageSlimming"
                id="com.mikyou.plugins.image.slimming.action.ImageSlimmingAction"
                description="compress picture plugin" icon="/img/icon_image_slimming.png">
            <add-to-group group-id="MainToolBar" anchor="after" relative-to-action="Android.MainToolBarSdkGroup"/>
        </action>

        <action id="com.mikyou.plugins.image.action.rightselectedaction"
                class="com.mikyou.plugins.image.slimming.action.RightSelectedAction" text="Quick Slim Images"
                description="Quick Slim Images">
            <add-to-group group-id="ProjectViewPopupMenu" anchor="after" relative-to-action="ReplaceInPath"/>
        </action>
    </actions>
  • extension包: 主要是定义了Kotlin中的扩展函数,一个是Boolean的扩展可以类似链式调用来替代if-else判断,另一个则是Dialog使用的扩展
//Boolean 扩展
sealed class BooleanExt<out T>

object Otherwise : BooleanExt<Nothing>()//Nothing是所有类的子类,协变的类继承关系和泛型参数类型继承关系一致

class TransferData<T>(val data: T) : BooleanExt<T>()

inline fun <T> Boolean.yes(block: () -> T): BooleanExt<T> = when {
   
    this -> TransferData(block.invoke())
    else -> Otherwise
}

inline fun <T> B
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊喵先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值